* [PATCH v2] git-p4: Add option to ignore empty commits @ 2015-12-08 9:36 larsxschneider 2015-12-08 9:36 ` [PATCH v2] git-p4: Add option to keep " larsxschneider 0 siblings, 1 reply; 3+ messages in thread From: larsxschneider @ 2015-12-08 9:36 UTC (permalink / raw) To: git; +Cc: luke, gitster, Lars Schneider From: Lars Schneider <larsxschneider@gmail.com> diff to v1: * change the default behavior and replace "ignore empty commits" option with "keep empty commits" (thanks Junio/Luke) --> I kept the original topic name in the subject letter to ease finding v1, ok? * add 'an' to fix grammar in commit message (thanks Luke) * remove quotes around 'true' in docs to avoid confusion (thanks Luke) * add deletion test (thanks Junio/Luke) * use print statement to avoid ugly \n (thanks Luke) * use positional argument specifiers in Python format string syntax to support Python 2.6 (thanks Pete Harlan) Thanks, Lars Lars Schneider (1): git-p4: Add option to keep empty commits Documentation/git-p4.txt | 4 ++ git-p4.py | 44 +++++++----- t/t9826-git-p4-keep-empty-commits.sh | 134 +++++++++++++++++++++++++++++++++++ 3 files changed, 165 insertions(+), 17 deletions(-) create mode 100755 t/t9826-git-p4-keep-empty-commits.sh -- 2.5.1 ^ permalink raw reply [flat|nested] 3+ messages in thread
* [PATCH v2] git-p4: Add option to keep empty commits 2015-12-08 9:36 [PATCH v2] git-p4: Add option to ignore empty commits larsxschneider @ 2015-12-08 9:36 ` larsxschneider 2015-12-10 1:05 ` Luke Diamand 0 siblings, 1 reply; 3+ messages in thread From: larsxschneider @ 2015-12-08 9:36 UTC (permalink / raw) To: git; +Cc: luke, gitster, Lars Schneider From: Lars Schneider <larsxschneider@gmail.com> A changelist that contains only excluded files due to a client spec was imported as an empty commit. Fix that issue by ignoring these commits. Add option "git-p4.keepEmptyCommits" to make the previous behavior available. Signed-off-by: Lars Schneider <larsxschneider@gmail.com> Helped-by: Pete Harlan --- Documentation/git-p4.txt | 4 ++ git-p4.py | 44 +++++++----- t/t9826-git-p4-keep-empty-commits.sh | 134 +++++++++++++++++++++++++++++++++++ 3 files changed, 165 insertions(+), 17 deletions(-) create mode 100755 t/t9826-git-p4-keep-empty-commits.sh diff --git a/Documentation/git-p4.txt b/Documentation/git-p4.txt index 82aa5d6..b3e768e 100644 --- a/Documentation/git-p4.txt +++ b/Documentation/git-p4.txt @@ -510,6 +510,10 @@ git-p4.useClientSpec:: option '--use-client-spec'. See the "CLIENT SPEC" section above. This variable is a boolean, not the name of a p4 client. +git-p4.keepEmptyCommits:: + A changelist that contains only excluded files will be imported + as an empty commit if this boolean option is set to true. + Submit variables ~~~~~~~~~~~~~~~~ git-p4.detectRenames:: diff --git a/git-p4.py b/git-p4.py index 0093fa3..62c26bc 100755 --- a/git-p4.py +++ b/git-p4.py @@ -2288,12 +2288,6 @@ class P4Sync(Command, P4UserMap): filesToDelete = [] for f in files: - # if using a client spec, only add the files that have - # a path in the client - if self.clientSpecDirs: - if self.clientSpecDirs.map_in_client(f['path']) == "": - continue - filesForCommit.append(f) if f['action'] in self.delete_actions: filesToDelete.append(f) @@ -2361,25 +2355,41 @@ class P4Sync(Command, P4UserMap): gitStream.write(description) gitStream.write("\n") + def inClientSpec(self, path): + if not self.clientSpecDirs: + return True + inClientSpec = self.clientSpecDirs.map_in_client(path) + if not inClientSpec and self.verbose: + print('Ignoring file outside of client spec: {0}'.format(path)) + return inClientSpec + + def hasBranchPrefix(self, path): + if not self.branchPrefixes: + return True + hasPrefix = [p for p in self.branchPrefixes + if p4PathStartsWith(path, p)] + if hasPrefix and self.verbose: + print('Ignoring file outside of prefix: {0}'.format(path)) + return hasPrefix + def commit(self, details, files, branch, parent = ""): epoch = details["time"] author = details["user"] if self.verbose: - print "commit into %s" % branch - - # start with reading files; if that fails, we should not - # create a commit. - new_files = [] - for f in files: - if [p for p in self.branchPrefixes if p4PathStartsWith(f['path'], p)]: - new_files.append (f) - else: - sys.stderr.write("Ignoring file outside of prefix: %s\n" % f['path']) + print('commit into {0}'.format(branch)) if self.clientSpecDirs: self.clientSpecDirs.update_client_spec_path_cache(files) + files = [f for f in files + if self.inClientSpec(f['path']) and self.hasBranchPrefix(f['path'])] + + if not files and not gitConfigBool('git-p4.keepEmptyCommits'): + print('Ignoring revision {0} as it would produce an empty commit.' + .format(details['change'])) + return + self.gitStream.write("commit %s\n" % branch) # gitStream.write("mark :%s\n" % details["change"]) self.committedChanges.add(int(details["change"])) @@ -2403,7 +2413,7 @@ class P4Sync(Command, P4UserMap): print "parent %s" % parent self.gitStream.write("from %s\n" % parent) - self.streamP4Files(new_files) + self.streamP4Files(files) self.gitStream.write("\n") change = int(details["change"]) diff --git a/t/t9826-git-p4-keep-empty-commits.sh b/t/t9826-git-p4-keep-empty-commits.sh new file mode 100755 index 0000000..be12960 --- /dev/null +++ b/t/t9826-git-p4-keep-empty-commits.sh @@ -0,0 +1,134 @@ +#!/bin/sh + +test_description='Clone repositories and keep empty commits' + +. ./lib-git-p4.sh + +test_expect_success 'start p4d' ' + start_p4d +' + +test_expect_success 'Create a repo' ' + client_view "//depot/... //client/..." && + ( + cd "$cli" && + + mkdir -p subdir && + + >subdir/file1.txt && + p4 add subdir/file1.txt && + p4 submit -d "Add file 1" && + + >file2.txt && + p4 add file2.txt && + p4 submit -d "Add file 2" && + + >subdir/file3.txt && + p4 add subdir/file3.txt && + p4 submit -d "Add file 3" && + + >file4.txt && + p4 add file4.txt && + p4 submit -d "Add file 4" && + + p4 delete subdir/file3.txt && + p4 submit -d "Remove file 3" && + + p4 delete file4.txt && + p4 submit -d "Remove file 4" + ) +' + +test_expect_success 'Clone repo root path with all history' ' + client_view "//depot/... //client/..." && + test_when_finished cleanup_git && + ( + cd "$git" && + git init . && + git p4 clone --use-client-spec --destination="$git" //depot@all && + cat >expect <<-\EOF && +Remove file 4 +[git-p4: depot-paths = "//depot/": change = 6] + +Remove file 3 +[git-p4: depot-paths = "//depot/": change = 5] + +Add file 4 +[git-p4: depot-paths = "//depot/": change = 4] + +Add file 3 +[git-p4: depot-paths = "//depot/": change = 3] + +Add file 2 +[git-p4: depot-paths = "//depot/": change = 2] + +Add file 1 +[git-p4: depot-paths = "//depot/": change = 1] + + EOF + git log --format=%B >actual && + test_cmp expect actual + ) +' + +test_expect_success 'Clone repo subdir with all history but keep empty commits' ' + client_view "//depot/subdir/... //client/subdir/..." && + test_when_finished cleanup_git && + ( + cd "$git" && + git init . && + git config git-p4.keepEmptyCommits true && + git p4 clone --use-client-spec --destination="$git" //depot@all && + cat >expect <<-\EOF && +Remove file 4 +[git-p4: depot-paths = "//depot/": change = 6] + +Remove file 3 +[git-p4: depot-paths = "//depot/": change = 5] + +Add file 4 +[git-p4: depot-paths = "//depot/": change = 4] + +Add file 3 +[git-p4: depot-paths = "//depot/": change = 3] + +Add file 2 +[git-p4: depot-paths = "//depot/": change = 2] + +Add file 1 +[git-p4: depot-paths = "//depot/": change = 1] + + EOF + git log --format=%B >actual && + test_cmp expect actual + ) +' + +test_expect_success 'Clone repo subdir with all history' ' + client_view "//depot/subdir/... //client/subdir/..." && + test_when_finished cleanup_git && + ( + cd "$git" && + git init . && + git p4 clone --use-client-spec --destination="$git" --verbose //depot@all && + cat >expect <<-\EOF && +Remove file 3 +[git-p4: depot-paths = "//depot/": change = 5] + +Add file 3 +[git-p4: depot-paths = "//depot/": change = 3] + +Add file 1 +[git-p4: depot-paths = "//depot/": change = 1] + + EOF + git log --format=%B >actual && + test_cmp expect actual + ) +' + +test_expect_success 'kill p4d' ' + kill_p4d +' + +test_done -- 2.5.1 ^ permalink raw reply related [flat|nested] 3+ messages in thread
* Re: [PATCH v2] git-p4: Add option to keep empty commits 2015-12-08 9:36 ` [PATCH v2] git-p4: Add option to keep " larsxschneider @ 2015-12-10 1:05 ` Luke Diamand 0 siblings, 0 replies; 3+ messages in thread From: Luke Diamand @ 2015-12-10 1:05 UTC (permalink / raw) To: Lars Schneider; +Cc: Git Users, Junio C Hamano On 8 December 2015 at 09:36, <larsxschneider@gmail.com> wrote: > From: Lars Schneider <larsxschneider@gmail.com> > > A changelist that contains only excluded files due to a client spec was > imported as an empty commit. Fix that issue by ignoring these commits. > Add option "git-p4.keepEmptyCommits" to make the previous behavior > available. Looks good to me. I think we discussed this a while back and it all seemed sensible then, apart from not being quite bold enough. Ack. > > Signed-off-by: Lars Schneider <larsxschneider@gmail.com> > Helped-by: Pete Harlan > --- > Documentation/git-p4.txt | 4 ++ > git-p4.py | 44 +++++++----- > t/t9826-git-p4-keep-empty-commits.sh | 134 +++++++++++++++++++++++++++++++++++ > 3 files changed, 165 insertions(+), 17 deletions(-) > create mode 100755 t/t9826-git-p4-keep-empty-commits.sh > > diff --git a/Documentation/git-p4.txt b/Documentation/git-p4.txt > index 82aa5d6..b3e768e 100644 > --- a/Documentation/git-p4.txt > +++ b/Documentation/git-p4.txt > @@ -510,6 +510,10 @@ git-p4.useClientSpec:: > option '--use-client-spec'. See the "CLIENT SPEC" section above. > This variable is a boolean, not the name of a p4 client. > > +git-p4.keepEmptyCommits:: > + A changelist that contains only excluded files will be imported > + as an empty commit if this boolean option is set to true. > + > Submit variables > ~~~~~~~~~~~~~~~~ > git-p4.detectRenames:: > diff --git a/git-p4.py b/git-p4.py > index 0093fa3..62c26bc 100755 > --- a/git-p4.py > +++ b/git-p4.py > @@ -2288,12 +2288,6 @@ class P4Sync(Command, P4UserMap): > filesToDelete = [] > > for f in files: > - # if using a client spec, only add the files that have > - # a path in the client > - if self.clientSpecDirs: > - if self.clientSpecDirs.map_in_client(f['path']) == "": > - continue > - > filesForCommit.append(f) > if f['action'] in self.delete_actions: > filesToDelete.append(f) > @@ -2361,25 +2355,41 @@ class P4Sync(Command, P4UserMap): > gitStream.write(description) > gitStream.write("\n") > > + def inClientSpec(self, path): > + if not self.clientSpecDirs: > + return True > + inClientSpec = self.clientSpecDirs.map_in_client(path) > + if not inClientSpec and self.verbose: > + print('Ignoring file outside of client spec: {0}'.format(path)) > + return inClientSpec > + > + def hasBranchPrefix(self, path): > + if not self.branchPrefixes: > + return True > + hasPrefix = [p for p in self.branchPrefixes > + if p4PathStartsWith(path, p)] > + if hasPrefix and self.verbose: > + print('Ignoring file outside of prefix: {0}'.format(path)) > + return hasPrefix > + > def commit(self, details, files, branch, parent = ""): > epoch = details["time"] > author = details["user"] > > if self.verbose: > - print "commit into %s" % branch > - > - # start with reading files; if that fails, we should not > - # create a commit. > - new_files = [] > - for f in files: > - if [p for p in self.branchPrefixes if p4PathStartsWith(f['path'], p)]: > - new_files.append (f) > - else: > - sys.stderr.write("Ignoring file outside of prefix: %s\n" % f['path']) > + print('commit into {0}'.format(branch)) > > if self.clientSpecDirs: > self.clientSpecDirs.update_client_spec_path_cache(files) > > + files = [f for f in files > + if self.inClientSpec(f['path']) and self.hasBranchPrefix(f['path'])] > + > + if not files and not gitConfigBool('git-p4.keepEmptyCommits'): > + print('Ignoring revision {0} as it would produce an empty commit.' > + .format(details['change'])) > + return > + > self.gitStream.write("commit %s\n" % branch) > # gitStream.write("mark :%s\n" % details["change"]) > self.committedChanges.add(int(details["change"])) > @@ -2403,7 +2413,7 @@ class P4Sync(Command, P4UserMap): > print "parent %s" % parent > self.gitStream.write("from %s\n" % parent) > > - self.streamP4Files(new_files) > + self.streamP4Files(files) > self.gitStream.write("\n") > > change = int(details["change"]) > diff --git a/t/t9826-git-p4-keep-empty-commits.sh b/t/t9826-git-p4-keep-empty-commits.sh > new file mode 100755 > index 0000000..be12960 > --- /dev/null > +++ b/t/t9826-git-p4-keep-empty-commits.sh > @@ -0,0 +1,134 @@ > +#!/bin/sh > + > +test_description='Clone repositories and keep empty commits' > + > +. ./lib-git-p4.sh > + > +test_expect_success 'start p4d' ' > + start_p4d > +' > + > +test_expect_success 'Create a repo' ' > + client_view "//depot/... //client/..." && > + ( > + cd "$cli" && > + > + mkdir -p subdir && > + > + >subdir/file1.txt && > + p4 add subdir/file1.txt && > + p4 submit -d "Add file 1" && > + > + >file2.txt && > + p4 add file2.txt && > + p4 submit -d "Add file 2" && > + > + >subdir/file3.txt && > + p4 add subdir/file3.txt && > + p4 submit -d "Add file 3" && > + > + >file4.txt && > + p4 add file4.txt && > + p4 submit -d "Add file 4" && > + > + p4 delete subdir/file3.txt && > + p4 submit -d "Remove file 3" && > + > + p4 delete file4.txt && > + p4 submit -d "Remove file 4" > + ) > +' > + > +test_expect_success 'Clone repo root path with all history' ' > + client_view "//depot/... //client/..." && > + test_when_finished cleanup_git && > + ( > + cd "$git" && > + git init . && > + git p4 clone --use-client-spec --destination="$git" //depot@all && > + cat >expect <<-\EOF && > +Remove file 4 > +[git-p4: depot-paths = "//depot/": change = 6] > + > +Remove file 3 > +[git-p4: depot-paths = "//depot/": change = 5] > + > +Add file 4 > +[git-p4: depot-paths = "//depot/": change = 4] > + > +Add file 3 > +[git-p4: depot-paths = "//depot/": change = 3] > + > +Add file 2 > +[git-p4: depot-paths = "//depot/": change = 2] > + > +Add file 1 > +[git-p4: depot-paths = "//depot/": change = 1] > + > + EOF > + git log --format=%B >actual && > + test_cmp expect actual > + ) > +' > + > +test_expect_success 'Clone repo subdir with all history but keep empty commits' ' > + client_view "//depot/subdir/... //client/subdir/..." && > + test_when_finished cleanup_git && > + ( > + cd "$git" && > + git init . && > + git config git-p4.keepEmptyCommits true && > + git p4 clone --use-client-spec --destination="$git" //depot@all && > + cat >expect <<-\EOF && > +Remove file 4 > +[git-p4: depot-paths = "//depot/": change = 6] > + > +Remove file 3 > +[git-p4: depot-paths = "//depot/": change = 5] > + > +Add file 4 > +[git-p4: depot-paths = "//depot/": change = 4] > + > +Add file 3 > +[git-p4: depot-paths = "//depot/": change = 3] > + > +Add file 2 > +[git-p4: depot-paths = "//depot/": change = 2] > + > +Add file 1 > +[git-p4: depot-paths = "//depot/": change = 1] > + > + EOF > + git log --format=%B >actual && > + test_cmp expect actual > + ) > +' > + > +test_expect_success 'Clone repo subdir with all history' ' > + client_view "//depot/subdir/... //client/subdir/..." && > + test_when_finished cleanup_git && > + ( > + cd "$git" && > + git init . && > + git p4 clone --use-client-spec --destination="$git" --verbose //depot@all && > + cat >expect <<-\EOF && > +Remove file 3 > +[git-p4: depot-paths = "//depot/": change = 5] > + > +Add file 3 > +[git-p4: depot-paths = "//depot/": change = 3] > + > +Add file 1 > +[git-p4: depot-paths = "//depot/": change = 1] > + > + EOF > + git log --format=%B >actual && > + test_cmp expect actual > + ) > +' > + > +test_expect_success 'kill p4d' ' > + kill_p4d > +' > + > +test_done > -- > 2.5.1 > ^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2015-12-10 1:06 UTC | newest] Thread overview: 3+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2015-12-08 9:36 [PATCH v2] git-p4: Add option to ignore empty commits larsxschneider 2015-12-08 9:36 ` [PATCH v2] git-p4: Add option to keep " larsxschneider 2015-12-10 1:05 ` Luke Diamand
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).