Re: cherry-picking fails after making a directory a submodule
On Mon, Jan 8, 2018 at 10:46 PM, Stefan Beller <sbel...@google.com> wrote: > On Mon, Jan 8, 2018 at 1:08 PM, Per Cederqvist <ced...@opera.com> wrote: >> I have a situation where I have switched a directory from being a >> subdirectory to being a submodule. I then try to cherry-pick a commit >> from a taskbranch that was made before the switch to the master >> branch. The commit touches a file outside the subdirectory/submodule. >> Yet "git cherry-pick" fails with this error message: >> >>> error: could not apply 78c403e... Add a project feature >>> hint: after resolving the conflicts, mark the corrected paths >>> hint: with 'git add ' or 'git rm ' >>> hint: and commit the result with 'git commit' >> >> I can resolve the situation by running "git add libfoo && git >> cherry-pick --continue". The generated commit contains no changes to >> "libfoo". >> >> I don't understand why I need to manually add libfoo, as the commit >> I'm cherry-picking doesn't touch anything in libfoo. >> >> The script below can reproduce the issue. Tested with git 2.15.1, >> 2.14.0 and 2.8.0, all with the same result. >> >> Is this a bug in "git cherry-pick"? > > Could you please test with > github.com/git/git/commit/c641ca67072946f95f87e7b21f13f3d4e73701e3 > included? (See its parent commit, for the test) > > From my cursory read that commit is the issue addressed in that commit. Thanks! I can confirm that applying the changes to merge-recursive.c from that commit fixes the issue in 2.15.1. /ceder
cherry-picking fails after making a directory a submodule
I have a situation where I have switched a directory from being a subdirectory to being a submodule. I then try to cherry-pick a commit from a taskbranch that was made before the switch to the master branch. The commit touches a file outside the subdirectory/submodule. Yet "git cherry-pick" fails with this error message: > error: could not apply 78c403e... Add a project feature > hint: after resolving the conflicts, mark the corrected paths > hint: with 'git add ' or 'git rm ' > hint: and commit the result with 'git commit' I can resolve the situation by running "git add libfoo && git cherry-pick --continue". The generated commit contains no changes to "libfoo". I don't understand why I need to manually add libfoo, as the commit I'm cherry-picking doesn't touch anything in libfoo. The script below can reproduce the issue. Tested with git 2.15.1, 2.14.0 and 2.8.0, all with the same result. Is this a bug in "git cherry-pick"? -- cut here for cherry-across-submodule -- #!/bin/sh # # This script creates a simple repo, where the "libfoo" directory # initially is a normal directory, but later becomes a git submodule. # It then tries to cherry-pick a commit (that doesn't touch libfoo) # that was created before the conversion to master (after the # conversion). This fails for unclear reasons. # I've tested this with the following git versions: # - 2.8.0 # - 2.14.0 # - 2.15.1 # # They all behave the same # export PATH=/usr/local/git-2.15.1/bin:$PATH set -e -x git --version # Refuse to run if this directory already exists, to prevent data loss. mkdir cherry-across-submodule-root cd cherry-across-submodule-root mkdir root (cd root && git init --bare libfoo.git) (cd root && git init --bare project.git) mkdir workspace (cd workspace && git clone ../root/libfoo) (cd workspace && git clone ../root/project) proj_commit () { (cd workspace/project && printf "$1\n" >> $2 && git add $2 && git commit -m"$3") } foo_commit () { (cd workspace/libfoo && printf "$1\n" >> $2 && git add $2 && git commit -m"$3") } both_commit () { foo_commit "$1" $2 "$3" proj_commit "$1" libfoo/$2 "Imported libfoo: $3" } proj_commit "This is a project" README "Started the project" mkdir workspace/project/libfoo both_commit "This is a library" README "Started the library" both_commit "all:\n\ttouch libfoo.a" Makefile "Build something" proj_commit "all:\n\tmake -C libfoo" Makefile "Build libfoo" proj_commit "ceder" AUTHORS "I made this" both_commit "GPL" "COPYING" "Add license info" (cd workspace/libfoo && git push) (cd workspace/project && git push) (cd workspace/project && git checkout -b task-1) proj_commit "int feature() { return 17; }" feature.c "Add a project feature" (cd workspace/project && git push -u origin task-1) assert_clean() { (cd workspace/project && [ -z "`git status --porcelain`" ] ) } # Cherrypicking task-1 to task-2 works fine. (cd workspace/project && git checkout -b task-2 master && git cherry-pick task-1) assert_clean (cd workspace/project && git checkout master && git rm -r libfoo && git submodule add -b master ../libfoo.git libfoo && git commit -m"Made libfoo a submodule") assert_clean # Now suddenly cherrypicking fails? I get this message from the # cherry-pick command: # error: could not apply 78c403e... Add a project feature # hint: after resolving the conflicts, mark the corrected paths # hint: with 'git add ' or 'git rm ' # hint: and commit the result with 'git commit' (cd workspace/project && git checkout -b task-3 master && git cherry-pick task-1) # At this point, "git status --porcelain" prints two lines: # A feature.c # AU libfoo assert_clean -- cut here for cherry-across-submodule -- /ceder
Re: git log: invert --author and --committer
On Mon, May 23, 2016 at 9:26 PM, Junio C Hamano <gits...@pobox.com> wrote: > Junio C Hamano <gits...@pobox.com> writes: > >> Per Cederqvist <ced...@opera.com> writes: >> >>> git log --invert-grep --author cibot >>... >> Yeah, the author/committer search piggy-backs the more generic "grep >> in the log" machinery, but it is quite hidden and the document >> failed to tell the end users that is what is going on. Mentioning >> that invert (or any tweak that works on the grep machinery) affects >> author/committer search is a good idea. >> >> Does "-i/--regexp-ignore-case" also need the same treatment? > > It seems it does. > > How about making this clarification not about --invert-grep but > about --committer/--author option, perhaps like this? > > Documentation/rev-list-options.txt | 4 > 1 file changed, 4 insertions(+) > > diff --git a/Documentation/rev-list-options.txt > b/Documentation/rev-list-options.txt > index 4f009d4..3fca366 100644 > --- a/Documentation/rev-list-options.txt > +++ b/Documentation/rev-list-options.txt > @@ -44,6 +44,10 @@ endif::git-rev-list[] > expression). With more than one `--author=`, > commits whose author matches any of the given patterns are > chosen (similarly for multiple `--committer=`). > ++ > +Options that affect how a regular expression match is performed > +(such as `-i`, `-E`, `--invert-grep`) can also be used affect these > +options. > > --grep-reflog=:: > Limit the commits output to ones with reflog entries that "can also be used to affect", right? (I think the word "to" is missing.) I think it does make sense to document this with the --author/--committer options. That wording would however make me assume that --all-match could also be used, so that git log --all-match --author ceder --author cibot would list nothing (since there are no authors that match both "ceder" and "cibot" in this codebase). That isn't the fact, though. It seems to list all commits that have either ceder or cibot as author, just as if I had not used --all-match. As a reader of the man-page, I would prefer to have the exact list of options in the documentation. (I realize that it will make it harder to maintain.) /ceder -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
git log: invert --author and --committer
We have a repository that mostly contains configuration data. This is updated by our continuous integration build system, but every once in a while there are also more interesting commits made by humans. For several years I have suffered in silence, wishing for a way to do something like git log --author-not cibot Today a friend told me that you can actually list all commits except those made by cibot with this commandline: git log --invert-grep --author cibot The documentation for --invert-grep should mention that it also inverts the meaning of --author and --committer. Perphaps something like this would make sense? /ceder diff --git a/Documentation/rev-list-options.txt b/Documentation/rev-list-options.txt index 4f009d4..ae12687 100644 --- a/Documentation/rev-list-options.txt +++ b/Documentation/rev-list-options.txt @@ -70,7 +70,8 @@ endif::git-rev-list[] --invert-grep:: Limit the commits output to ones with log message that do not - match the pattern specified with `--grep=`. + match the pattern specified with `--grep=`. Also + affects `--author=` and `--committer=`. -i:: --regexp-ignore-case:: -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH 10/10] submodule deinit: complain when given a file instead of a submodule
After this change, what is the simplest way to programmatically deinit any submodule that may exist, without failing if there are none? "git commit" by default refuses to make an empty commit, but it has the --allow-empty option. "git rm -r ." by default fails if there are no files in the repository, but it has the --ignore-unmatch option. It makes sense that "git submodule deinit ." should fail if there are no submodules, but please add support for --ignore-unmatch at the same time. /ceder On Sat, Apr 30, 2016 at 2:40 AM, Stefan Beller <sbel...@google.com> wrote: > This also improves performance for listing submodules, because > S_ISGITLINK is both faster as match_pathspec as well as expected to > be true in fewer cases, so putting it first in the condition will speed > up the loop to compute all submodules. > > As this partially reverts 84ba959bbdf0 (submodule: fix regression for > deinit without submodules, 2016-03-22), this also disallows the use > of `git submodule deinit .` to deinit all submodules, when no > submodules are present. `deinit .` continues to work on repositories, > which have at least one submodule. > > CC: Per Cederqvist <ced...@opera.com> > Signed-off-by: Stefan Beller <sbel...@google.com> > --- > > >> Patch 10 is a controversial thing I'd assume as it breaks existing users. >> We should take it for the next major release (i.e. 3.0) >> I just want to put it out here now. > > builtin/submodule--helper.c | 6 +++--- > t/t7400-submodule-basic.sh | 15 ++- > 2 files changed, 17 insertions(+), 4 deletions(-) > > diff --git a/builtin/submodule--helper.c b/builtin/submodule--helper.c > index 7f0941d..e41de3e 100644 > --- a/builtin/submodule--helper.c > +++ b/builtin/submodule--helper.c > @@ -242,9 +242,9 @@ static int module_list_compute(int argc, const char > **argv, > for (i = 0; i < active_nr; i++) { > const struct cache_entry *ce = active_cache[i]; > > - if (!match_pathspec(pathspec, ce->name, ce_namelen(ce), > - 0, ps_matched, 1) || > - !S_ISGITLINK(ce->ce_mode)) > + if (!S_ISGITLINK(ce->ce_mode) || > + !match_pathspec(pathspec, ce->name, ce_namelen(ce), > + 0, ps_matched, 1)) > continue; > > ALLOC_GROW(list->entries, list->nr + 1, list->alloc); > diff --git a/t/t7400-submodule-basic.sh b/t/t7400-submodule-basic.sh > index 53644da..361e6f6 100755 > --- a/t/t7400-submodule-basic.sh > +++ b/t/t7400-submodule-basic.sh > @@ -915,7 +915,20 @@ test_expect_success 'submodule deinit works on > repository without submodules' ' > >file && > git add file && > git commit -m "repo should not be empty" && > - git submodule deinit . > + git submodule deinit > + ) > +' > + > +test_expect_success 'submodule deinit refuses to deinit a file' ' > + test_when_finished "rm -rf newdirectory" && > + mkdir newdirectory && > + ( > + cd newdirectory && > + git init && > + >file && > + git add file && > + git commit -m "repo should not be empty" && > + test_must_fail git submodule deinit file > ) > ' > > -- > 2.8.0.32.g71f8beb.dirty > -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
"git submodule deinit -f ." no longer works when there are no submodules
It used to be possible to run git submodule deinit -f . to remove any submodules, no matter how many submodules you had. That is no longer possible in projects that don't have any submodules at all. The command will fail with: error: pathspec '.' did not match any file(s) known to git. But if I run "git submodule deinit" (without the ".") git tells me: Use '.' if you really want to deinitialize all submodules This is a regression introduced in Git 2.7.0 (and v2.7.0-rv0). "git bisect" points to this commit: commit 74703a1e4dfc5affcb8944e78b53f0817b492246 (refs/bisect/bad) Author: Stefan BellerDate: 2015-09-02 14:42:24 -0700 submodule: rewrite `module_list` shell function in C One could argue that it makes no sense to run "git submodule deinit -f ." in a repository with no submodules. I've written a continuous integration system for a project where some branches have submodules and other don't, and I found it convenient to don't have to treat those branches differently. The following shellscript demonstrates the issue. It passes on git version before 2.7.0, and fails on later versions. --- cut here --- #!/bin/sh # # This script demonstrates the "git submodule deinit ." bug. # if ! mkdir subdeinit then echo 'Covardly refusing to alter the "subdeinit" directory.' >&2 echo 'Please remove it, or run this script inside an empty directory.' >&2 exit 1 fi cd subdeinit mkdir repo cd repo git init echo test > test git add test git commit -m"Create an initial commit." if git submodule deinit -f . then echo PASS: git submodule deinit -f . is allowed. exit 0 else echo FAIL: git submodule deinit -f . is not allowed. exit 1 fi --- cut here --- Yours, /ceder -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
"git submodule sync --recursive" documentation omission
The git-submodule(1) is inconsistent. In the synopsis, it says: git submodule [--quiet] sync [--recursive] [--] [...] The description of the sync does not mention --recursive, and the description of --recursive says that it is only available for foreach, update and status. The option appears to work, so the documentation should be updated. Tested with version 2.6.3. /ceder -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH 2/2] pager_in_use: make sure output is still going to pager
On Mon, Aug 10, 2015 at 7:24 PM, Jeff King p...@peff.net wrote: On Mon, Aug 10, 2015 at 06:38:10PM +0200, Johannes Schindelin wrote: +const char *pipe_id_get(int fd) +{ + static struct strbuf id = STRBUF_INIT; + struct stat st; + + if (fstat(fd, st) 0 || !S_ISFIFO(st.st_mode)) + return NULL; Just a quick note: it seems that this check is not really working on Windows. I tested this by running this test case manually (because TTY is not set on Windows): Yeah, I'm not too surprised. I'm guessing your st_ino for pipes are all just the same or something. Or maybe S_ISFIFO doesn't pass (we don't technically need it, I don't think, and could just drop that check). If you remove the S_ISFIFO check, you probably need to include the st_dev field in the pipe id. Otherwise, you could be unlucky and redirect the output to a file that just happens to have the same inode number as the pager pipe. Remember, inode numbers are only unique within a certain st_dev. /ceder -- To unsubscribe from this list: send the line unsubscribe git in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[GUILT 0/5] doc: less guilt-foo invocations, minor Makefile fixes
guilt no longer supports running commands on the guilt-add form. You need to use guilt add instead. This patch series updates most of the documentation to use the supported guilt add form. There is one known instance where I did not change the style: in the NAME section in Documentation/guilt-*.txt. The reason is that if I change it there, xmlto will create the man pages as e.g. guilt_add.1 instead of guilt-add.1, and I don't know how to fix that. Also, the git man pages (as of Git 2.1.0) still have git-add under the NAME heading of git-add(1), so it might be wise to follow suite. While working on this, I also found two minor issues with Documentation/Makefile. /ceder Per Cederqvist (5): Fix generation of Documentation/usage-%.txt. doc: guilt.xml depends on cmds.txt. doc: don't use guilt-foo invocations in examples. doc: don't use guilt-foo invocations in usage messages. doc: git doesn't use git-foo invocations. Documentation/.gitignore| 3 +++ Documentation/Makefile | 6 -- Documentation/guilt-add.txt | 4 ++-- Documentation/guilt-delete.txt | 2 +- Documentation/guilt-diff.txt| 2 +- Documentation/guilt-help.txt| 4 ++-- Documentation/guilt-new.txt | 6 +++--- Documentation/guilt-refresh.txt | 2 +- Documentation/guilt-repair.txt | 2 +- Documentation/guilt-rm.txt | 2 +- Documentation/guilt-select.txt | 4 ++-- Documentation/usage.sh | 8 +++- 12 files changed, 24 insertions(+), 21 deletions(-) -- 2.1.0 -- To unsubscribe from this list: send the line unsubscribe git in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[GUILT 3/5] doc: don't use guilt-foo invocations in examples.
Note: there is one place where I replace guilt-repair with guilt repair instead of +guilt repair+. At least the version of docbook I'm using mishandles the + signs in that particular spot (even though it works properly for +guilt select+ in another file. I know too little docbook to be able to find the cause. Signed-off-by: Per Cederqvist ced...@opera.com --- Documentation/guilt-add.txt| 2 +- Documentation/guilt-delete.txt | 2 +- Documentation/guilt-diff.txt | 2 +- Documentation/guilt-help.txt | 4 ++-- Documentation/guilt-new.txt| 6 +++--- Documentation/guilt-repair.txt | 2 +- Documentation/guilt-select.txt | 4 ++-- 7 files changed, 11 insertions(+), 11 deletions(-) diff --git a/Documentation/guilt-add.txt b/Documentation/guilt-add.txt index 6d2785a..a276f09 100644 --- a/Documentation/guilt-add.txt +++ b/Documentation/guilt-add.txt @@ -24,7 +24,7 @@ EXAMPLES Create and add a new file example.c $ touch example.c - $ guilt-add example.c + $ guilt add example.c Author -- diff --git a/Documentation/guilt-delete.txt b/Documentation/guilt-delete.txt index ef57dc6..4e8c28c 100644 --- a/Documentation/guilt-delete.txt +++ b/Documentation/guilt-delete.txt @@ -25,7 +25,7 @@ EXAMPLES Delete a patch called 'foobar': - $ guilt-delete foobar + $ guilt delete foobar Author -- diff --git a/Documentation/guilt-diff.txt b/Documentation/guilt-diff.txt index 986ceca..0ee062c 100644 --- a/Documentation/guilt-diff.txt +++ b/Documentation/guilt-diff.txt @@ -18,7 +18,7 @@ OPTIONS --- -z:: Output a interdiff against the top-most applied patch. This should - produce the same diff as +guilt-new -f foo+. + produce the same diff as +guilt new -f foo+. path...:: Restrict diff output to a given set of files. diff --git a/Documentation/guilt-help.txt b/Documentation/guilt-help.txt index ed6a5cf..df0e0fb 100644 --- a/Documentation/guilt-help.txt +++ b/Documentation/guilt-help.txt @@ -18,11 +18,11 @@ EXAMPLES Open the guilt-status man page - $ guilt-help status + $ guilt help status Open the guilt man page - $ guilt-help + $ guilt help Author -- diff --git a/Documentation/guilt-new.txt b/Documentation/guilt-new.txt index a2c8a4c..698dcb7 100644 --- a/Documentation/guilt-new.txt +++ b/Documentation/guilt-new.txt @@ -42,16 +42,16 @@ EXAMPLES Create a new patch called 'foobar': - $ guilt-new foobar + $ guilt new foobar Create a patch called 'foo' and supply a patch description interactively: - $ guilt-new -e foo + $ guilt new -e foo Create a patch called 'bar' with a provided patch description and sign off on the patch: - $ guilt-new -s -m patch-fu bar + $ guilt new -s -m patch-fu bar Author -- diff --git a/Documentation/guilt-repair.txt b/Documentation/guilt-repair.txt index 4aa472b..4faf113 100644 --- a/Documentation/guilt-repair.txt +++ b/Documentation/guilt-repair.txt @@ -22,7 +22,7 @@ Perform various repository repairs. You must specify one mode of repair: WARNING: Running this command may result in commits and working directory changes being lost. You may want to create a new reference (e.g., branch, or reflog) to the original HEAD before using - guilt-repair. + guilt repair. --status:: Upgrade the status file from old format to new. diff --git a/Documentation/guilt-select.txt b/Documentation/guilt-select.txt index f7fb5f7..dd5833e 100644 --- a/Documentation/guilt-select.txt +++ b/Documentation/guilt-select.txt @@ -19,10 +19,10 @@ the following way: * An unguarded patch is always applied. * A patch with a positive guard is applied *only* if the guard is -selected with guilt-select. +selected with +guilt select+. * A patch with a negative guard is applied *unless* the guard is -selected with guilt-select. +selected with +guilt select+. OPTIONS --- -- 2.1.0 -- To unsubscribe from this list: send the line unsubscribe git in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[GUILT 2/5] doc: guilt.xml depends on cmds.txt.
Specify an explicit dependency, to stop make from trying to generate guilt.xml if cmds.txt could not be created. The asciidoc will fail and produce an error message that might hide the original error message. The added dependency causes make to not remove the guilt.xml file. Add *.xml to .gitignore. Signed-off-by: Per Cederqvist ced...@opera.com --- Documentation/.gitignore | 3 +++ Documentation/Makefile | 2 ++ 2 files changed, 5 insertions(+) diff --git a/Documentation/.gitignore b/Documentation/.gitignore index c4f0588..9b8d4da 100644 --- a/Documentation/.gitignore +++ b/Documentation/.gitignore @@ -11,3 +11,6 @@ version.txt # Generated file dependency list doc.dep + +# Intermediate generated files +*.xml diff --git a/Documentation/Makefile b/Documentation/Makefile index ec3c9e8..2574125 100644 --- a/Documentation/Makefile +++ b/Documentation/Makefile @@ -60,6 +60,8 @@ cmds.txt: cmd-list.sh $(MAN1_TXT) guilt.7 guilt.html: guilt.txt footer.txt version.txt +guilt.xml: cmds.txt + clean: rm -f *.xml *.html *.1 *.7 doc.dep rm -f cmds.txt -- 2.1.0 -- To unsubscribe from this list: send the line unsubscribe git in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[GUILT 1/5] Fix generation of Documentation/usage-%.txt.
The old rule worked, most of the time, but had several issues: - It depended on the corresponding guilt-*.txt file, but the usage.sh script actually reads ../guilt-foo. - Actually, each usage-%.txt depended on all guilt-*.txt files, so make had to do more work than necessary if a single file was altered. - The construct broke parallel make, which would spawn several usage.sh at once. This leads to unnecessary work, and could potentially result in broken usage files if the echo some_string some_file construct used by usage.sh isn't atomic. Fixed by letting the usage.sh script update a single file, and writing a proper implicit make rule. This makes parallel make work a lot better. There is a small downside, though, as usage.sh will now be run once for each command (if everything is regenerated). I think it is worth to pay that price to get the correctness. This command is still very fast compared to the docbook processing. Signed-off-by: Per Cederqvist ced...@opera.com --- Documentation/Makefile | 4 ++-- Documentation/usage.sh | 8 +++- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/Documentation/Makefile b/Documentation/Makefile index b6c3285..ec3c9e8 100644 --- a/Documentation/Makefile +++ b/Documentation/Makefile @@ -66,8 +66,8 @@ clean: rm -f usage-*.txt rm -f version.txt -usage-%.txt: $(MAN1_TXT) usage.sh - sh ./usage.sh +usage-guilt-%.txt: ../guilt-% usage.sh + sh ./usage.sh $ %.html : %.txt footer.txt version.txt $(ASCIIDOC) -b xhtml11 -d manpage -f asciidoc.conf $(ASCIIDOC_EXTRA) $ diff --git a/Documentation/usage.sh b/Documentation/usage.sh index 20fdca4..629f546 100644 --- a/Documentation/usage.sh +++ b/Documentation/usage.sh @@ -1,7 +1,5 @@ #!/bin/sh -for i in `ls ../guilt-*`; do - name=$(basename $i) - u=$(grep USAGE $i | sed 's/USAGE=//' | sed 's/$//') - echo '$name' $u usage-$name.txt -done +name=$(basename $1) +u=$(grep USAGE $1 | sed 's/USAGE=//' | sed 's/$//') +echo '$name' $u usage-$name.txt -- 2.1.0 -- To unsubscribe from this list: send the line unsubscribe git in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[GUILT 4/5] doc: don't use guilt-foo invocations in usage messages.
Signed-off-by: Per Cederqvist ced...@opera.com --- Documentation/usage.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Documentation/usage.sh b/Documentation/usage.sh index 629f546..9cc49f7 --- a/Documentation/usage.sh +++ b/Documentation/usage.sh @@ -2,4 +2,4 @@ name=$(basename $1) u=$(grep USAGE $1 | sed 's/USAGE=//' | sed 's/$//') -echo '$name' $u usage-$name.txt +echo '`echo $name|sed -e 's/^guilt-/guilt /'`' $u usage-$name.txt -- 2.1.0 -- To unsubscribe from this list: send the line unsubscribe git in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[GUILT 5/5] doc: git doesn't use git-foo invocations.
Make them into reference to the man pages instead. Signed-off-by: Per Cederqvist ced...@opera.com --- Documentation/guilt-add.txt | 2 +- Documentation/guilt-refresh.txt | 2 +- Documentation/guilt-rm.txt | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Documentation/guilt-add.txt b/Documentation/guilt-add.txt index a276f09..067b6ca 100644 --- a/Documentation/guilt-add.txt +++ b/Documentation/guilt-add.txt @@ -11,7 +11,7 @@ include::usage-guilt-add.txt[] DESCRIPTION --- -Adds the files specified to git using git-add making it available to guilt. +Adds the files specified to git using git-add(1) making it available to guilt. OPTIONS --- diff --git a/Documentation/guilt-refresh.txt b/Documentation/guilt-refresh.txt index 7757bdc..98076e3 100644 --- a/Documentation/guilt-refresh.txt +++ b/Documentation/guilt-refresh.txt @@ -23,7 +23,7 @@ OPTIONS Include a diffstat output in the patch file. Useful for cases where patches will be submitted with other tools. + -If the command line option is omitted, the corresponding git-config +If the command line option is omitted, the corresponding git-config(1) option guilt.diffstat will be queried. So this would enable diffstat output by default: diff --git a/Documentation/guilt-rm.txt b/Documentation/guilt-rm.txt index 71b49fe..cfe471e 100644 --- a/Documentation/guilt-rm.txt +++ b/Documentation/guilt-rm.txt @@ -11,7 +11,7 @@ include::usage-guilt-rm.txt[] DESCRIPTION --- -Removes the files specified from git using git-rm +Removes the files specified from git using git-rm(1). OPTIONS --- -- 2.1.0 -- To unsubscribe from this list: send the line unsubscribe git in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[GUILT 2/2] Teach guilt graph the -x exclude-pattern option.
Some projects keep a ChangeLog which every commit modifies. This makes the graph a very uninteresting single line of commits. It is sometimes useful to see how the graph would look if we ignore the ChangeLog file. The new -x option is useful in situations like this. It can be repeated several times to ignore many files. Each argument is saved to a temporary file and grep -v -f $TEMPORARY is used to filter out the file names you want to ignore. Also added a minimal test case and documentation. Signed-off-by: Per Cederqvist ced...@opera.com --- Documentation/guilt-graph.txt | 5 + guilt-graph | 24 ++-- regression/t-033.out | 12 regression/t-033.sh | 3 +++ 4 files changed, 38 insertions(+), 6 deletions(-) diff --git a/Documentation/guilt-graph.txt b/Documentation/guilt-graph.txt index f43206e..eeed321 100644 --- a/Documentation/guilt-graph.txt +++ b/Documentation/guilt-graph.txt @@ -16,6 +16,11 @@ patches. OPTIONS --- +-x pattern:: + Ignore files that matches the given grep pattern. Can be + repeated to ignore several files. This can be useful to ignore + for instance ChangeLog files that every commit modifies. + patchname:: Instead of starting with the topmost applied patch, start with patchname. diff --git a/guilt-graph b/guilt-graph index d90c2f1..4d5fe46 100755 --- a/guilt-graph +++ b/guilt-graph @@ -3,7 +3,7 @@ # Copyright (c) Josef Jeff Sipek, 2007-2013 # -USAGE=[patchname] +USAGE=[-x exclude-pattern]... [patchname] if [ -z $GUILT_VERSION ]; then echo Invoking `basename $0` directly is no longer supported. 2 exit 1 @@ -11,6 +11,22 @@ fi _main() { +cache=$GUILT_DIR/$branch/.graphcache.$$ +xclude=$GUILT_DIR/$branch/.graphexclude.$$ +trap rm -rf \$cache\ \$xclude\ 0 +mkdir $cache +$xclude + +while [ $# -gt 0 ]; do +if [ $1 = -x ] [ $# -ge 2 ]; then + echo $2 $xclude + shift + shift +else + break +fi +done + if [ $# -gt 1 ]; then usage fi @@ -39,10 +55,6 @@ getfiles() git diff-tree -r $1^ $1 | cut -f2 } -cache=$GUILT_DIR/$branch/.graphcache.$$ -mkdir $cache -trap rm -rf \$cache\ 0 - disp digraph G { current=$top @@ -66,7 +78,7 @@ while [ $current != $base ]; do rm -f $cache/dep touch $cache/dep - getfiles $current | while read f; do + getfiles $current | grep -v -f $xclude | while read f; do # hash the filename fh=`echo $f | sha1 | cut -d' ' -f1` if [ -e $cache/$fh ]; then diff --git a/regression/t-033.out b/regression/t-033.out index c120d4f..1ed371f 100644 --- a/regression/t-033.out +++ b/regression/t-033.out @@ -88,3 +88,15 @@ digraph G { ff2775f8d1dc753f635830adcc3a067e0b681e2d [label=a.patch] 891bc14b5603474c9743fd04f3da888644413dc5 - ff2775f8d1dc753f635830adcc3a067e0b681e2d; // ? } +%% The same graph, but excluding deps introduced by file.txt. +% guilt graph -x file.txt +digraph G { +# checking rev bc7df666a646739eaf559af23cab72f2bfd01f0e + bc7df666a646739eaf559af23cab72f2bfd01f0e [label=a-\betterquicker'-patch.patch] +# checking rev 891bc14b5603474c9743fd04f3da888644413dc5 + 891bc14b5603474c9743fd04f3da888644413dc5 [label=c.patch] +# checking rev c7014443c33d2b0237293687ceb9cbd38313df65 + c7014443c33d2b0237293687ceb9cbd38313df65 [label=b.patch] +# checking rev ff2775f8d1dc753f635830adcc3a067e0b681e2d + ff2775f8d1dc753f635830adcc3a067e0b681e2d [label=a.patch] +} diff --git a/regression/t-033.sh b/regression/t-033.sh index 9fe1827..ae22914 100755 --- a/regression/t-033.sh +++ b/regression/t-033.sh @@ -59,3 +59,6 @@ cmd git add file.txt cmd guilt refresh fixup_time_info a-\betterquicker'-patch.patch cmd guilt graph + +echo %% The same graph, but excluding deps introduced by file.txt. +cmd guilt graph -x file.txt -- 2.1.0 -- To unsubscribe from this list: send the line unsubscribe git in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[GUILT 1/2] guilt graph: Simplify getfiles.
git diff-tree by default emits TAB-separated fields. cut by defaults processes TAB-separated fields. Simplify getfiles() by using TAB as the separator. Signed-off-by: Per Cederqvist ced...@opera.com --- guilt-graph | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/guilt-graph b/guilt-graph index 0857e0d..d90c2f1 100755 --- a/guilt-graph +++ b/guilt-graph @@ -36,7 +36,7 @@ fi getfiles() { - git diff-tree -r $1^ $1 | tr '\t' ' ' | cut -d' ' -f6 + git diff-tree -r $1^ $1 | cut -f2 } cache=$GUILT_DIR/$branch/.graphcache.$$ -- 2.1.0 -- To unsubscribe from this list: send the line unsubscribe git in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [GUILT 1/5] Fix generation of Documentation/usage-%.txt.
On Fri, Jan 23, 2015 at 3:21 PM, Jeff Sipek jef...@josefsipek.net wrote: On Fri, Jan 23, 2015 at 02:24:55PM +0100, Per Cederqvist wrote: The old rule worked, most of the time, but had several issues: - It depended on the corresponding guilt-*.txt file, but the usage.sh script actually reads ../guilt-foo. - Actually, each usage-%.txt depended on all guilt-*.txt files, so make had to do more work than necessary if a single file was altered. - The construct broke parallel make, which would spawn several usage.sh at once. This leads to unnecessary work, and could potentially result in broken usage files if the echo some_string some_file construct used by usage.sh isn't atomic. Fixed by letting the usage.sh script update a single file, and writing a proper implicit make rule. This makes parallel make work a lot better. Nice! There is a small downside, though, as usage.sh will now be run once for each command (if everything is regenerated). I think it is worth to pay that price to get the correctness. This command is still very fast compared to the docbook processing. Given how much simple usage.sh got, I'm thinking it might be worth it to just remove it, and just shove the rule into the makefile itself. Ok, I tried to write it. I came up with the following. (Note: I have *not* tested it.) It's not *that* ugly. usage-guilt-%.txt: ../guilt-% usage.sh echo '$(basename $)' `sed -n -e '/^USAGE=/{s/USAGE=//; s/$//; p; q}' $` $@ What do you think? Too opaque? Your change looks good. Too opaque, and not tested enough. It doesn't work, since make will handle all $. You need to write $$ instead of $ in at least one of the places. I would stick with usage.sh, as getting the quoting right when you have make, shell, subshells, and sed all at the same time is just too painful. But it is of course up to you. You are the maintainer. :-) /ceder Jeff. Signed-off-by: Per Cederqvist ced...@opera.com --- Documentation/Makefile | 4 ++-- Documentation/usage.sh | 8 +++- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/Documentation/Makefile b/Documentation/Makefile index b6c3285..ec3c9e8 100644 --- a/Documentation/Makefile +++ b/Documentation/Makefile @@ -66,8 +66,8 @@ clean: rm -f usage-*.txt rm -f version.txt -usage-%.txt: $(MAN1_TXT) usage.sh - sh ./usage.sh +usage-guilt-%.txt: ../guilt-% usage.sh + sh ./usage.sh $ %.html : %.txt footer.txt version.txt $(ASCIIDOC) -b xhtml11 -d manpage -f asciidoc.conf $(ASCIIDOC_EXTRA) $ diff --git a/Documentation/usage.sh b/Documentation/usage.sh index 20fdca4..629f546 100644 --- a/Documentation/usage.sh +++ b/Documentation/usage.sh @@ -1,7 +1,5 @@ #!/bin/sh -for i in `ls ../guilt-*`; do - name=$(basename $i) - u=$(grep USAGE $i | sed 's/USAGE=//' | sed 's/$//') - echo '$name' $u usage-$name.txt -done +name=$(basename $1) +u=$(grep USAGE $1 | sed 's/USAGE=//' | sed 's/$//') +echo '$name' $u usage-$name.txt -- 2.1.0 -- The reasonable man adapts himself to the world; the unreasonable one persists in trying to adapt the world to himself. Therefore all progress depends on the unreasonable man. - George Bernard Shaw -- To unsubscribe from this list: send the line unsubscribe git in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[GUILT 0/2] Teach guilt graph to ignore some files.
If you use a ChangeLog, all output from guilt graph will be a boring line of commits. By using guilt graph -x ChangeLog things will look more interesting. Also: simplify getfiles. (This work is also available on the guilt-graph-ignore-2015-v1 branch of the git://repo.or.cz/guilt/ceder.git repository. (That branch is based on the doc-dash-2015-v1 branch that contains my documentation fixes, so if you just want these two commits you will have to cherry-pick.)) /ceder Per Cederqvist (2): guilt graph: Simplify getfiles. Teach guilt graph the -x exclude-pattern option. Documentation/guilt-graph.txt | 5 + guilt-graph | 26 +++--- regression/t-033.out | 12 regression/t-033.sh | 3 +++ 4 files changed, 39 insertions(+), 7 deletions(-) -- 2.1.0 -- To unsubscribe from this list: send the line unsubscribe git in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [GUILT v4 15/33] Produce legal patch names in guilt-import-commit.
Replacing echo with printf as in your patch works fine for me. I've applied Signed-off-by lines from you for the latest commits, rebased it on top of your current master commit, and pushed the series to the oslo-2014-v5 branch of git://repo.or.cz/guilt/ceder.git /ceder On Thu, Jan 22, 2015 at 3:15 PM, Jeff Sipek jef...@josefsipek.net wrote: I just tried to run the regression suite on my OpenIndiana laptop and I got this failure. 034: --- t-034.out 2015-01-22 14:02:23.634515474 + +++ /tmp/guilt.log.148782015-01-22 14:03:54.258790788 + @@ -83,7 +83,7 @@ [master aedb74f] @ Author: Author Name author@email 1 file changed, 1 insertion(+) -% create_commit a Backslash\is\forbidden. +% create_commit a Backslash\is orbidden. [master 0a46f8f] Backslash\is\forbidden. Author: Author Name author@email 1 file changed, 1 insertion(+) Test failed! Test: 034 Log file: /tmp/guilt.log.14878 Repo dir: /tmp/guilt reg.12106 make[1]: *** [all] Error 1 It's obviously the cmd command printing that's busted. The following change makes the test suite pass. Does it work for you? (If so, I'll commit it after pulling your whole series.) Thanks, Jeff. diff --git a/regression/scaffold b/regression/scaffold index 97cff4e..593e9da 100644 --- a/regression/scaffold +++ b/regression/scaffold @@ -50,7 +50,7 @@ function filter_dd # usage: cmd cmd.. function cmd { - echo % $@ + printf %% %s\n $* if ! ( exec 31 rv=`(($@ 21; echo $? 4) | replace_path 3 ) 41` On Sun, May 18, 2014 at 11:59:51PM +0200, Per Cederqvist wrote: Try harder to create patch names that adhere to the rules in git-check-ref-format(1) when deriving a patch name from the commit message. Verify that the derived name using git check-ref-format, and as a final fallback simply use the patch name x (to ensure that the code is future-proof in case new rules are added in the future). Always append a .patch suffix to the patch name. Added test cases. Signed-off-by: Per Cederqvist ced...@opera.com Signed-off-by: Josef 'Jeff' Sipek jef...@josefsipek.net --- guilt-import-commit | 20 +- regression/t-034.out | 567 +++ regression/t-034.sh | 71 +++ 3 files changed, 656 insertions(+), 2 deletions(-) create mode 100644 regression/t-034.out create mode 100755 regression/t-034.sh diff --git a/guilt-import-commit b/guilt-import-commit index f14647c..6260c56 100755 --- a/guilt-import-commit +++ b/guilt-import-commit @@ -28,19 +28,35 @@ disp Current head: `git rev-parse \`git_branch\`` 2 for rev in `git rev-list $rhash`; do s=`git log --pretty=oneline -1 $rev | cut -c 42-` + # Try to convert the first line of the commit message to a + # valid patch name. fname=`echo $s | sed -e s//and/g -e s/[ :]/_/g -e s,[/\\],-,g \ -e s/['\\[{}]//g -e 's/]//g' -e 's/\*/-/g' \ - -e 's/\?/-/g' | tr A-Z a-z` + -e 's/\?/-/g' -e 's/\.\.\.*/./g' -e 's/^\.//' \ + -e 's/\.patch$//' -e 's/\.$//' | tr A-Z a-z` + + if ! valid_patchname $fname; then + # Try harder to make it a legal commit name by + # removing all but a few safe characters. + fname=`echo $fname|tr -d -c _a-zA-Z0-9---/\\n` + fi + if ! valid_patchname $fname; then + # If we failed to derive a legal patch name, use the + # name x. (If this happens, we likely have to + # append a suffix to make the name unique.) + fname=x + fi disp Converting `echo $rev | cut -c 1-8` as $fname mangle_prefix=1 fname_base=$fname - while [ -f $GUILT_DIR/$branch/$fname ]; do + while [ -f $GUILT_DIR/$branch/$fname.patch ]; do fname=$fname_base-$mangle_prefix mangle_prefix=`expr $mangle_prefix + 1` disp Patch under that name exists...trying '$fname' done + fname=$fname.patch ( do_make_header $rev diff --git a/regression/t-034.out b/regression/t-034.out new file mode 100644 index 000..7bc9459 --- /dev/null +++ b/regression/t-034.out @@ -0,0 +1,567 @@ +% setup_git_repo +% git tag base +% create_commit a The sequence /. is forbidden. +[master eebb76e] The sequence /. is forbidden. + Author: Author Name author@email + 1 file changed, 1 insertion(+) + create mode 100644 a +% create_commit a The sequence .lock/ is forbidden. +[master 45e81b5] The sequence .lock/ is forbidden. + Author: Author Name author@email + 1 file changed, 1 insertion(+) +% create_commit a A/component/may/not/end/in/foo.lock +[master bbf3f59] A/component/may/not/end/in/foo.lock + Author: Author Name author@email + 1 file changed, 1 insertion(+) +% create_commit a Two consecutive
Re: [GUILT v3 14/31] Use git check-ref-format to validate patch names.
On Fri, May 16, 2014 at 5:20 PM, Jeff Sipek jef...@josefsipek.net wrote: On Fri, May 16, 2014 at 04:46:01PM +0200, Per Cederqvist wrote: The valid_patchname now lets git check-ref-format do its job instead of trying (and failing) to implement the same rules. See git-check-ref-format(1) for a list of the rules. Refer to the git-check-ref-format(1) man page in the error messages produced when valid_patchname indicates that the name is bad. Added testcases that breaks most of the rules in that man-page. Git version 1.8.5 no longer allows the single character @ as a branch name. Guilt always rejects that name, for increased compatibility. Signed-off-by: Per Cederqvist ced...@opera.com Signed-off-by: Josef 'Jeff' Sipek jef...@josefsipek.net --- guilt| 21 ++- guilt-fork | 2 +- guilt-import | 2 +- guilt-new| 2 +- regression/t-025.out | 426 +-- regression/t-025.sh | 12 +- regression/t-032.out | 4 +- 7 files changed, 446 insertions(+), 23 deletions(-) diff --git a/guilt b/guilt index 3fc524e..23cc2da 100755 --- a/guilt +++ b/guilt @@ -132,14 +132,19 @@ fi # usage: valid_patchname patchname valid_patchname() { - case $1 in - /*|./*|../*|*/./*|*/../*|*/.|*/..|*/|*\ *|*\*) - return 1;; - *:*) - return 1;; - *) - return 0;; - esac + if git check-ref-format --allow-onelevel $1; then I know I already signed off on this, but I just tried to run the regression suite with your changes on 1.7.3.2. It blows up because --allow-onelevel is not recognized. Yes, 1.7 is a bit on the old side but I think it's reasonable to still support it. Thoughts? Oh. I was not aware that --allow-onelevel was so new (it was added in Git 1.7.8). I'll rewrite this using git check-ref-format a/$1 instead. + # Starting with Git version 1.8.5, a branch cannot be + # the single character @. Make sure guilt rejects + # that name even if we are currently using an older + # version of Git. This ensures that the test suite + # runs fine using any version of Git. + if [ $1 = @ ]; then + return 1 + fi + return 0 There were other changes in Git version 1.7.6.4 and 1.7.8. I'll add similar code for those as well in the upcoming v4 of the series. With those changes, the test suite works with Git 1.5.0 and newer (I've checked all versions made of three numbers, but not those made of four numbers.) Jeff, I'll remove your signed-off-by so that you can check the new code that I will post within a couple of days. /ceder + else + return 1 + fi } get_branch() diff --git a/guilt-fork b/guilt-fork index a85d391..6447e55 100755 --- a/guilt-fork +++ b/guilt-fork @@ -37,7 +37,7 @@ else fi if ! valid_patchname $newpatch; then - die The specified patch name contains invalid characters (:). + die The specified patch name is invalid according to git-check-ref-format(1). fi if [ -e $GUILT_DIR/$branch/$newpatch ]; then diff --git a/guilt-import b/guilt-import index 3e9b3bb..928e325 100755 --- a/guilt-import +++ b/guilt-import @@ -40,7 +40,7 @@ if [ -e $GUILT_DIR/$branch/$newname ]; then fi if ! valid_patchname $newname; then - die The specified patch name contains invalid characters (:). + die The specified patch name is invalid according to git-check-ref-format(1). fi # create any directories as needed diff --git a/guilt-new b/guilt-new index 9528438..9f7fa44 100755 --- a/guilt-new +++ b/guilt-new @@ -64,7 +64,7 @@ fi if ! valid_patchname $patch; then disp Patchname is invalid. 2 - die it cannot begin with '/', './' or '../', or contain /./, /../, or whitespace + die It must follow the rules in git-check-ref-format(1). fi # create any directories as needed diff --git a/regression/t-025.out b/regression/t-025.out index 7811ab1..01bc406 100644 --- a/regression/t-025.out +++ b/regression/t-025.out @@ -141,7 +141,7 @@ f da39a3ee5e6b4b0d3255bfef95601890afd80709 .git/patches/master/prepend r acdeef96ee30eb34bbbf65d11de5cf7da4b5fee8 .git/refs/patches/master/prepend % guilt new white space Patchname is invalid. -it cannot begin with '/', './' or '../', or contain /./, /../, or whitespace +It must follow the rules in git-check-ref-format(1). % list_files d .git/patches d .git/patches/master @@ -211,7 +211,7 @@ f da39a3ee5e6b4b0d3255bfef95601890afd80709 .git/patches/master/prepend r acdeef96ee30eb34bbbf65d11de5cf7da4b5fee8 .git/refs/patches/master/prepend % guilt new /abc Patchname is invalid. -it cannot begin with '/', './' or '../', or contain /./, /../, or whitespace +It must follow the rules in git-check-ref-format(1
Re: [GUILT v3 09/31] Test suite: properly check the exit status of commands.
On Fri, May 16, 2014 at 5:45 PM, Jeff Sipek jef...@josefsipek.net wrote: On Fri, May 16, 2014 at 04:45:56PM +0200, Per Cederqvist wrote: The cmd and shouldfail functions checked the exit status of the replace_path function instead of the actual command that was running. (The $? construct checks the exit status of the last command in a pipeline, not the first command.) Updated t-032.sh, which used shouldfail instead of cmd in one place. (The comment in the script makes it clear that the command is expected to succeed.) Signed-off-by: Per Cederqvist ced...@opera.com --- regression/scaffold | 17 +++-- regression/t-032.sh | 2 +- 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/regression/scaffold b/regression/scaffold index 5c8b73e..e4d7487 100644 --- a/regression/scaffold +++ b/regression/scaffold @@ -51,18 +51,23 @@ function filter_dd function cmd { echo % $@ - $@ 21 | replace_path return 0 - return 1 + ( + exec 31 + rv=`(($@ 21; echo $? 4) | replace_path 3 ) 41` Wow. This took a while to decipher :) Ancien wisdom from the Csh Programming Considered Harmful article: http://www.faqs.org/faqs/unix-faq/shell/csh-whynot/ These functions work only because of the set -e earlier in scaffold. The final return statements are not actually reached. I don't like that. So the next version of the patch series will print an explicit message like % FAIL: The above command should succeed but failed. or % FAIL: The above command should fail but succeeded. and do an explicit exit 1 on failure. I think it makes it easier to debug issues. (I recently spent a few hours trying to figure our why the test just silently exited. Turns out the old git version I was running didn't like my .gitconfig, so it exited with a non-zero exit code...) Signed-off-by: Josef 'Jeff' Sipek jef...@josefsipek.net I'll let you re-check the next version of the code. /ceder + exit $rv + ) + return $? } # usage: shouldfail cmd.. function shouldfail { echo % $@ - ( - $@ 21 || return 0 - return 1 - ) | replace_path + ! ( + exec 31 + rv=`(($@ 21; echo $? 4) | replace_path 3 ) 41` + exit $rv + ) return $? } diff --git a/regression/t-032.sh b/regression/t-032.sh index b1d5f19..bba401e 100755 --- a/regression/t-032.sh +++ b/regression/t-032.sh @@ -28,7 +28,7 @@ shouldfail guilt import -P foo3 foo cmd guilt import -P foo2 foo # ok -shouldfail guilt import foo +cmd guilt import foo # duplicate patch name (implicit) shouldfail guilt import foo -- 1.8.3.1 -- Fact: 28.1% of all statistics are generated randomly. -- To unsubscribe from this list: send the line unsubscribe git in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[GUILT v4 00/33] Teach guilt import-commit how to create legal patch names, and more
This is version 4 of the patch series I sent back on 21 Mar 2014. I have addressed all feedback to date, update the documentation where needed, improved the error handling in the cmd and shouldfail functions in the test suite, fixed compatibility with older Git versions, and added signed-off-by lines from Jeff Sipek for those commits that I have received an explicit approval from him (but only if I have not made any other change to that particular commit). I have added two new patches: * Patch 32/33 adds documentation and test cases for the new regexp functionality of guilt header. This could be folded into patch 12. * Patch 33/33 adds documentation for the exit value of guilt push and guilt pop. This could be folded into patches 25-26. To see how the patches have evolved, you might find http://www.lysator.liu.se/~ceder/guilt-oslo-2014-v4/ useful. It displays diffs of all the patches between v3 and v4, in pdiffdiff output format. Here is the original blurb for the series, slightly edited: I recently found myself sitting on a train with a computer in front of me. I tried to use guilt import-commit, which seemed to work, but when I tried to guilt push the commits I had just imported I got some errors. It turned out that guilt import-commit had generated invalid patch names. I decided to fix the issue, and write a test case that demonstrated the problem. One thing led to another, and here I am, a few late nights at a hotel and a return trip on the train later, submitting a patch series in 28 parts. Sorry about the number of patches, but this is what happens when you uncover a bug while writing a test case for the bug you uncovered while writing a test case for your original problem. The patch series consists of: - A number of fixes to the test suite. - A number of bug fixes which I hope are non-controversial. Most of the fixes have test cases. - Changed behavior: guilt push when there is nothing more to push now uses exit status 1. This makes it possible to write shell loops such as while guilt push; do make test||break; done. Also, guilt pop when no patches are applied also uses exit status 1. (This aligns guilt push and guilt pop with how hg qpush and hg qpop has worked for several years.) - Changed behavior: by default, guilt no longer changes branch when you push a patch. You need to do git config guilt.reusebranch false to re-enable that. This patch sets the default value of guilt.reusebranch to true; it should in my opinion change to false a year or two after the next release. - The humble beginnings of a coding style guide. A more detailed overview of the patches: 1. Some tests fail if git config guilt.diffstat true is in effect. 2-4. Some commands fail if run from a directory with spaces in its name. 5. guilt new had an overly restrictive argument parser. 6-8. guilt.diffstat could break guilt fold and guilt new. 9-10. The test suite did not test exit status properly. 11. Remove pointless redirections in the test suite. 12-13. guilt header tried to check if a patch existed, but the check was broken. 14-16. Various parts of guilt tried to ensure that patch names were legal git branch names, but failed. 17-20. guilt graph failed when no patch was applied, and when a branch name contained a comma or a quote. 21-23. git config log.decorate short caused guilt import-commit, guilt patchbomb and guilt rebase to fail in various ways. 24. Patches may contain backslashes, but various informative messages from guilt did backslash processing. 25-26. guilt push and guilt pop should fail when there is nothing to do. 28. Fix coding style problems in a test case. 27, 29. These two commits were things I intended to contribute a while back, when contributing the Change git branch when patches are applied change (commit 67d3af63f422). These commits makes that behavior optional, and it defaults to being disabled, so that you can use both Guilt v0.35 (and earlier) and the current Guilt code against the same repo. These commits add some code complexity, and you might want to skip them if you think the current behavior is better. 30. A coding style guide, with Emacs support. 31. Avoid using git log -p. 32. Test case + doc for guilt header. 33. Doc for guilt push and guilt pop. This patch series is also available on http://repo.or.cz/w/guilt/ceder.git in the oslo-2014-v4 branch. If you already have a copy of guilt, you should be able to fetch that branch with something like: git remote add ceder http://repo.or.cz/r/guilt/ceder.git git fetch ceder refs/heads/oslo-2014-v4:refs/remotes/ceder/oslo-2014-v4 A few of the regression/t-*.out files contain non-ASCII characters. I hope they survive the mail transfer; if not, please use the repo above to fetch the commits. Per Cederqvist (33): The tests should not fail if guilt.diffstat is set
[GUILT v4 01/33] The tests should not fail if guilt.diffstat is set.
Explicitly set guilt.diffstat to its default value. Without this, the 027 test (and possibly others) fail if guilt.diffstat is set to true in ~/.gitconfig. Signed-off-by: Per Cederqvist ced...@opera.com Signed-off-by: Josef 'Jeff' Sipek jef...@josefsipek.net --- regression/scaffold | 1 + 1 file changed, 1 insertion(+) diff --git a/regression/scaffold b/regression/scaffold index 546d8c6..5c8b73e 100644 --- a/regression/scaffold +++ b/regression/scaffold @@ -87,6 +87,7 @@ function setup_git_repo # Explicitly set config that the tests rely on. git config log.date default git config log.decorate no + git config guilt.diffstat false } function setup_guilt_repo -- 1.8.3.1 -- To unsubscribe from this list: send the line unsubscribe git in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[GUILT v4 02/33] Allow guilt delete -f to run from a dir which contains spaces.
Signed-off-by: Per Cederqvist ced...@opera.com Signed-off-by: Josef 'Jeff' Sipek jef...@josefsipek.net --- guilt-delete | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/guilt-delete b/guilt-delete index 3e394f8..967ac10 100755 --- a/guilt-delete +++ b/guilt-delete @@ -49,7 +49,7 @@ series_remove_patch $patch guilt_hook delete $patch -[ ! -z $force ] rm -f $GUILT_DIR/$branch/$patch +[ ! -z $force ] rm -f $GUILT_DIR/$branch/$patch exit 0 -- 1.8.3.1 -- To unsubscribe from this list: send the line unsubscribe git in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[GUILT v4 04/33] Allow guilt import-commit to run from a dir which contains spaces.
Signed-off-by: Per Cederqvist ced...@opera.com Signed-off-by: Josef 'Jeff' Sipek jef...@josefsipek.net --- guilt-import-commit | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/guilt-import-commit b/guilt-import-commit index 20dcee2..f14647c 100755 --- a/guilt-import-commit +++ b/guilt-import-commit @@ -23,7 +23,7 @@ if ! must_commit_first; then fi disp About to begin conversion... 2 -disp Current head: `cat $GIT_DIR/refs/heads/\`git_branch\`` 2 +disp Current head: `git rev-parse \`git_branch\`` 2 for rev in `git rev-list $rhash`; do s=`git log --pretty=oneline -1 $rev | cut -c 42-` @@ -46,7 +46,7 @@ for rev in `git rev-list $rhash`; do do_make_header $rev echo git diff --binary $rev^..$rev - ) $GUILT_DIR/$branch/$fname + ) $GUILT_DIR/$branch/$fname # FIXME: grab the GIT_AUTHOR_DATE from the commit object and set the # timestamp on the patch @@ -68,6 +68,6 @@ for rev in `git rev-list $rhash`; do done disp Done. 2 -disp Current head: `cat $GIT_DIR/refs/heads/\`git_branch\`` 2 +disp Current head: `git rev-parse \`git_branch\`` 2 } -- 1.8.3.1 -- To unsubscribe from this list: send the line unsubscribe git in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[GUILT v4 03/33] Added test case for guilt delete -f.
Ensure that the file really is deleted. Signed-off-by: Per Cederqvist ced...@opera.com Signed-off-by: Josef 'Jeff' Sipek jef...@josefsipek.net --- regression/t-026.out | 15 +++ regression/t-026.sh | 5 - 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/regression/t-026.out b/regression/t-026.out index 3b9fb14..be50b48 100644 --- a/regression/t-026.out +++ b/regression/t-026.out @@ -29,3 +29,18 @@ f 7848194fd2e9ee0eb6589482900687d799d60a12 .git/patches/master/series f 9c18cc7abe6b87f18503714a80a677b4094eb457 .git/patches/master/add f bc9ab2e0f5db99d483961e956e814d963f0309f8 .git/patches/master/modify f da39a3ee5e6b4b0d3255bfef95601890afd80709 .git/patches/master/status +% guilt new delete-me +% guilt pop +All patches popped. +% guilt delete -f delete-me +% list_files +d .git/patches +d .git/patches/master +d .git/refs/patches +d .git/refs/patches/master +f 22930c6d1f1938f298a4fca51c57e4b47171db21 .git/patches/master/mode +f 413390f3906f16f30b054a4fb86c1e014b964504 .git/patches/master/remove +f 7848194fd2e9ee0eb6589482900687d799d60a12 .git/patches/master/series +f 9c18cc7abe6b87f18503714a80a677b4094eb457 .git/patches/master/add +f bc9ab2e0f5db99d483961e956e814d963f0309f8 .git/patches/master/modify +f da39a3ee5e6b4b0d3255bfef95601890afd80709 .git/patches/master/status diff --git a/regression/t-026.sh b/regression/t-026.sh index 0ccdf85..e25d0df 100755 --- a/regression/t-026.sh +++ b/regression/t-026.sh @@ -20,4 +20,7 @@ cmd guilt delete add cmd list_files -# FIXME: test delete -f +cmd guilt new delete-me +cmd guilt pop +cmd guilt delete -f delete-me +cmd list_files -- 1.8.3.1 -- To unsubscribe from this list: send the line unsubscribe git in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[GUILT v4 06/33] Fix the do_get_patch function.
A patch file consists of: (1) the description (2) optional diffstat (3) the patches When extracting the patch, we only want part 3. The do_get_patch used to give us part 2 and part 3. That made for instance this series of operations fail if guilt.diffstat is true: $ guilt new empty-1 $ guilt new empty-2 $ guilt pop Now at empty-1 $ guilt fold empty-2 $ guilt pop All patches popped. $ guilt push Applying patch..empty-1 fatal: unrecognized input To force apply this patch, use 'guilt push -f' Signed-off-by: Per Cederqvist ced...@opera.com Signed-off-by: Josef 'Jeff' Sipek jef...@josefsipek.net --- guilt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/guilt b/guilt index 8701481..3fc524e 100755 --- a/guilt +++ b/guilt @@ -334,7 +334,7 @@ do_get_patch() { awk ' BEGIN{} -/^(diff |---$|--- )/ {patch = 1} +/^(diff |--- )/ {patch = 1} patch == 1 {print $0} END{} ' $1 -- 1.8.3.1 -- To unsubscribe from this list: send the line unsubscribe git in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[GUILT v4 07/33] Added test cases for guilt fold.
Test that we can combine any combination of patches with empty and non-empty messages, both with and without guilt.diffstat. (All patches are empty.) Signed-off-by: Per Cederqvist ced...@opera.com Signed-off-by: Josef 'Jeff' Sipek jef...@josefsipek.net --- regression/t-035.out | 467 +++ regression/t-035.sh | 61 +++ 2 files changed, 528 insertions(+) create mode 100644 regression/t-035.out create mode 100755 regression/t-035.sh diff --git a/regression/t-035.out b/regression/t-035.out new file mode 100644 index 000..cc16fb4 --- /dev/null +++ b/regression/t-035.out @@ -0,0 +1,467 @@ +% setup_repo +% git config guilt.diffstat true +%% empty + empty (diffstat=true) +% guilt new empty-1 +% guilt pop +All patches popped. +% guilt push +Applying patch..empty-1 +Patch applied. +% guilt new empty-2 +% guilt pop +Now at empty-1. +% guilt push +Applying patch..empty-2 +Patch applied. +% guilt pop +Now at empty-1. +% guilt fold empty-2 +% guilt pop +All patches popped. +% guilt push +Applying patch..empty-1 +Patch applied. +% list_files +d .git/patches +d .git/patches/master +d .git/refs/patches +d .git/refs/patches/master +f 22930c6d1f1938f298a4fca51c57e4b47171db21 .git/patches/master/mode +f 413390f3906f16f30b054a4fb86c1e014b964504 .git/patches/master/remove +f 4ea806e306f0228a8ef41f186035e7b04097f1f2 .git/patches/master/status +f 7d261b8caad0f161c21daf5de65eeb521ff8c067 .git/patches/master/empty-1 +f 9c18cc7abe6b87f18503714a80a677b4094eb457 .git/patches/master/add +f bc9ab2e0f5db99d483961e956e814d963f0309f8 .git/patches/master/modify +f d28d87b88c1e24d637e390dc3603cfa7c1715711 .git/patches/master/series +f da39a3ee5e6b4b0d3255bfef95601890afd80709 .git/patches/master/empty-1~ +f da39a3ee5e6b4b0d3255bfef95601890afd80709 .git/patches/master/empty-2~ +r bde3d337af70f36836ad606c800d194006f883b3 .git/refs/patches/master/empty-1 +% guilt pop +All patches popped. +% guilt delete -f empty-1 +% list_files +d .git/patches +d .git/patches/master +d .git/refs/patches +d .git/refs/patches/master +f 22930c6d1f1938f298a4fca51c57e4b47171db21 .git/patches/master/mode +f 413390f3906f16f30b054a4fb86c1e014b964504 .git/patches/master/remove +f 9c18cc7abe6b87f18503714a80a677b4094eb457 .git/patches/master/add +f bacb4aad8a55fe4e7aa58a9ae169990bb764069f .git/patches/master/series +f bc9ab2e0f5db99d483961e956e814d963f0309f8 .git/patches/master/modify +f da39a3ee5e6b4b0d3255bfef95601890afd80709 .git/patches/master/empty-1~ +f da39a3ee5e6b4b0d3255bfef95601890afd80709 .git/patches/master/empty-2~ +f da39a3ee5e6b4b0d3255bfef95601890afd80709 .git/patches/master/status +%% empty + nonempty (diffstat=true) +% guilt new empty +% guilt pop +All patches popped. +% guilt push +Applying patch..empty +Patch applied. +% guilt new -f -s -m A commit message. nonempty +% guilt pop +Now at empty. +% guilt push +Applying patch..nonempty +Patch applied. +% guilt pop +Now at empty. +% guilt fold nonempty +% guilt pop +All patches popped. +% guilt push +Applying patch..empty +Patch applied. +% list_files +d .git/patches +d .git/patches/master +d .git/refs/patches +d .git/refs/patches/master +f 15aab0fd8b937eb3bb01841693f35dcb75da2faf .git/patches/master/status +f 22930c6d1f1938f298a4fca51c57e4b47171db21 .git/patches/master/mode +f 413390f3906f16f30b054a4fb86c1e014b964504 .git/patches/master/remove +f 51fcfcf16db2903f19ab4a4a3caacd297ea9f6cd .git/patches/master/empty~ +f 51fcfcf16db2903f19ab4a4a3caacd297ea9f6cd .git/patches/master/nonempty~ +f 683678040eef9334d6329e00d5b9babda3e65b57 .git/patches/master/empty +f 9c18cc7abe6b87f18503714a80a677b4094eb457 .git/patches/master/add +f a26a22287b500a2a372e42c2bab03599bbe37cdf .git/patches/master/series +f bc9ab2e0f5db99d483961e956e814d963f0309f8 .git/patches/master/modify +f da39a3ee5e6b4b0d3255bfef95601890afd80709 .git/patches/master/empty-1~ +f da39a3ee5e6b4b0d3255bfef95601890afd80709 .git/patches/master/empty-2~ +r 4eedaa32894fc07af3298d8c1178052942a3ca6a .git/refs/patches/master/empty +% guilt pop +All patches popped. +% guilt delete -f empty +% list_files +d .git/patches +d .git/patches/master +d .git/refs/patches +d .git/refs/patches/master +f 22930c6d1f1938f298a4fca51c57e4b47171db21 .git/patches/master/mode +f 413390f3906f16f30b054a4fb86c1e014b964504 .git/patches/master/remove +f 51fcfcf16db2903f19ab4a4a3caacd297ea9f6cd .git/patches/master/empty~ +f 51fcfcf16db2903f19ab4a4a3caacd297ea9f6cd .git/patches/master/nonempty~ +f 9c18cc7abe6b87f18503714a80a677b4094eb457 .git/patches/master/add +f bacb4aad8a55fe4e7aa58a9ae169990bb764069f .git/patches/master/series +f bc9ab2e0f5db99d483961e956e814d963f0309f8 .git/patches/master/modify +f da39a3ee5e6b4b0d3255bfef95601890afd80709 .git/patches/master/empty-1~ +f da39a3ee5e6b4b0d3255bfef95601890afd80709 .git/patches/master/empty-2~ +f da39a3ee5e6b4b0d3255bfef95601890afd80709 .git/patches/master/status +%% nonempty + empty (diffstat=true) +% guilt new -f -s -m A commit
[GUILT v4 05/33] guilt new: Accept more than 4 arguments.
The argument parser arbitrarily refused to accept more than 4 arguments. That made it impossible to run guilt new -f -s -m msg patch. Removed the checks for the number of arguments from the guilt new parser -- the other checks that are already there are enough to catch all errors. Give a better error message if -m isn't followed by a message argument. Signed-off-by: Per Cederqvist ced...@opera.com Signed-off-by: Josef 'Jeff' Sipek jef...@josefsipek.net --- guilt-new | 7 +++ 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/guilt-new b/guilt-new index bb68924..9528438 100755 --- a/guilt-new +++ b/guilt-new @@ -11,10 +11,6 @@ fi _main() { -if [ $# -lt 1 ] || [ $# -gt 4 ]; then - usage -fi - while [ $# -gt 0 ] ; do case $1 in -f) @@ -31,6 +27,9 @@ while [ $# -gt 0 ] ; do fi ;; -m) + if [ $# -eq 1 ]; then + usage + fi msg=$2 shift -- 1.8.3.1 -- To unsubscribe from this list: send the line unsubscribe git in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[GUILT v4 08/33] Added more test cases for guilt new: empty patches.
Test that empty patches are handled correctly, both with and without the guilt.diffstat configuration option. Signed-off-by: Per Cederqvist ced...@opera.com Signed-off-by: Josef 'Jeff' Sipek jef...@josefsipek.net --- regression/t-020.out | 269 +++ regression/t-020.sh | 60 2 files changed, 329 insertions(+) diff --git a/regression/t-020.out b/regression/t-020.out index af45734..42433dc 100644 --- a/regression/t-020.out +++ b/regression/t-020.out @@ -1128,3 +1128,272 @@ f 9c18cc7abe6b87f18503714a80a677b4094eb457 .git/patches/master/add f bacb4aad8a55fe4e7aa58a9ae169990bb764069f .git/patches/master/series f bc9ab2e0f5db99d483961e956e814d963f0309f8 .git/patches/master/modify f da39a3ee5e6b4b0d3255bfef95601890afd80709 .git/patches/master/status +% guilt new empty.patch +% guilt pop +All patches popped. +% guilt push +Applying patch..empty.patch +Patch applied. +% list_files +d .git/patches +d .git/patches/master +d .git/refs/patches +d .git/refs/patches/master +f 22930c6d1f1938f298a4fca51c57e4b47171db21 .git/patches/master/mode +f 413390f3906f16f30b054a4fb86c1e014b964504 .git/patches/master/remove +f 9c18cc7abe6b87f18503714a80a677b4094eb457 .git/patches/master/add +f bc9ab2e0f5db99d483961e956e814d963f0309f8 .git/patches/master/modify +f d15a1d2d34493f790c78ddacb8815b0b9536ee2b .git/patches/master/series +f da39a3ee5e6b4b0d3255bfef95601890afd80709 .git/patches/master/empty.patch +f e90b964f01cbef60bbe00c38c55d9ea86618a66a .git/patches/master/status +r c7a139f532a43c3c8b0e068cac04f8f6af0f94e1 .git/refs/patches/master/empty.patch +% git log -p +commit c7a139f532a43c3c8b0e068cac04f8f6af0f94e1 +Author: Author Name author@email +Date: Mon Jan 1 00:00:00 2007 + + +patch empty.patch + +commit d4850419ccc1146c7169f500725ce504b9774ed0 +Author: Author Name author@email +Date: Mon Jan 1 00:00:00 2007 + + +initial + +Signed-off-by: Commiter Name commiter@email + +diff --git a/def b/def +new file mode 100644 +index 000..8baef1b +--- /dev/null b/def +@@ -0,0 +1 @@ ++abc +% git config guilt.diffstat true +% guilt refresh +Patch empty.patch refreshed +% guilt pop +All patches popped. +% guilt push +Applying patch..empty.patch +Patch applied. +% list_files +d .git/patches +d .git/patches/master +d .git/refs/patches +d .git/refs/patches/master +f 22930c6d1f1938f298a4fca51c57e4b47171db21 .git/patches/master/mode +f 413390f3906f16f30b054a4fb86c1e014b964504 .git/patches/master/remove +f 7d261b8caad0f161c21daf5de65eeb521ff8c067 .git/patches/master/empty.patch +f 9c18cc7abe6b87f18503714a80a677b4094eb457 .git/patches/master/add +f bc9ab2e0f5db99d483961e956e814d963f0309f8 .git/patches/master/modify +f d15a1d2d34493f790c78ddacb8815b0b9536ee2b .git/patches/master/series +f da39a3ee5e6b4b0d3255bfef95601890afd80709 .git/patches/master/empty.patch~ +f e90b964f01cbef60bbe00c38c55d9ea86618a66a .git/patches/master/status +r c7a139f532a43c3c8b0e068cac04f8f6af0f94e1 .git/refs/patches/master/empty.patch +% git log -p +commit c7a139f532a43c3c8b0e068cac04f8f6af0f94e1 +Author: Author Name author@email +Date: Mon Jan 1 00:00:00 2007 + + +patch empty.patch + +commit d4850419ccc1146c7169f500725ce504b9774ed0 +Author: Author Name author@email +Date: Mon Jan 1 00:00:00 2007 + + +initial + +Signed-off-by: Commiter Name commiter@email + +diff --git a/def b/def +new file mode 100644 +index 000..8baef1b +--- /dev/null b/def +@@ -0,0 +1 @@ ++abc +% git config guilt.diffstat false +% guilt pop +All patches popped. +% guilt push +Applying patch..empty.patch +Patch applied. +% list_files +d .git/patches +d .git/patches/master +d .git/refs/patches +d .git/refs/patches/master +f 22930c6d1f1938f298a4fca51c57e4b47171db21 .git/patches/master/mode +f 413390f3906f16f30b054a4fb86c1e014b964504 .git/patches/master/remove +f 7ad87a0bdb8cf0a57cfc384633edabbb9c2bfa1b .git/patches/master/empty.patch +f 9c18cc7abe6b87f18503714a80a677b4094eb457 .git/patches/master/add +f bc9ab2e0f5db99d483961e956e814d963f0309f8 .git/patches/master/modify +f d15a1d2d34493f790c78ddacb8815b0b9536ee2b .git/patches/master/series +f da39a3ee5e6b4b0d3255bfef95601890afd80709 .git/patches/master/empty.patch~ +f e90b964f01cbef60bbe00c38c55d9ea86618a66a .git/patches/master/status +r 8ed27228b117c0c88abf3d586bcc43c68e975cea .git/refs/patches/master/empty.patch +% git log -p +commit 8ed27228b117c0c88abf3d586bcc43c68e975cea +Author: Per Cederqvist ce...@lysator.liu.se +Date: Mon Jan 1 00:00:00 2007 + + +Fix a bug. + +This commit fixes a serious bug. + +FIXME: +- add a test case +- track down the bug +- actually fix it + +commit d4850419ccc1146c7169f500725ce504b9774ed0 +Author: Author Name author@email +Date: Mon Jan 1 00:00:00 2007 + + +initial + +Signed-off-by: Commiter Name commiter@email + +diff --git a/def b/def +new file mode 100644 +index 000..8baef1b
[GUILT v4 09/33] Test suite: properly check the exit status of commands.
The cmd and shouldfail functions checked the exit status of the replace_path function instead of the actual command that was running. (The $? construct checks the exit status of the last command in a pipeline, not the first command.) Print an explicit error message if a command that should fail actually succeeds. Updated t-032.sh, which used shouldfail instead of cmd in one place. (The comment in the script makes it clear that the command is expected to succeed.) Signed-off-by: Per Cederqvist ced...@opera.com --- regression/scaffold | 23 --- regression/t-032.sh | 2 +- 2 files changed, 17 insertions(+), 8 deletions(-) diff --git a/regression/scaffold b/regression/scaffold index 5c8b73e..2e04c83 100644 --- a/regression/scaffold +++ b/regression/scaffold @@ -51,19 +51,28 @@ function filter_dd function cmd { echo % $@ - $@ 21 | replace_path return 0 - return 1 + if ! ( + exec 31 + rv=`(($@ 21; echo $? 4) | replace_path 3 ) 41` + exit $rv + ) ; then + echo % FAIL: The above command should succeed but failed. + exit 1 + fi } # usage: shouldfail cmd.. function shouldfail { echo % $@ - ( - $@ 21 || return 0 - return 1 - ) | replace_path - return $? + if ( + exec 31 + rv=`(($@ 21; echo $? 4) | replace_path 3 ) 41` + exit $rv + ) ; then + echo % FAIL: The above command should fail but succeeded. + exit 1 + fi } # usage: list_files diff --git a/regression/t-032.sh b/regression/t-032.sh index b1d5f19..bba401e 100755 --- a/regression/t-032.sh +++ b/regression/t-032.sh @@ -28,7 +28,7 @@ shouldfail guilt import -P foo3 foo cmd guilt import -P foo2 foo # ok -shouldfail guilt import foo +cmd guilt import foo # duplicate patch name (implicit) shouldfail guilt import foo -- 1.8.3.1 -- To unsubscribe from this list: send the line unsubscribe git in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[GUILT v4 10/33] Run test_failed if the exit status of a test script is bad.
There were two problems with the old code: - Since set -e is in effect (that is set in scaffold) the run-test script exited immediately if a t-*.sh script failed. This is not nice, as we want the error report that test_failed prints. - The code ran cd - between running the t-*.sh script and checking the exit status, so the exit status was lost. (Actually, the exit status was saved in $ERR, but nothing ever looked at $ERR.) Signed-off-by: Per Cederqvist ced...@opera.com Signed-off-by: Josef 'Jeff' Sipek jef...@josefsipek.net --- regression/run-tests | 10 +++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/regression/run-tests b/regression/run-tests index a10e796..8e0af9f 100755 --- a/regression/run-tests +++ b/regression/run-tests @@ -55,11 +55,15 @@ function run_test # run the test cd $REPODIR /dev/null - $REG_DIR/t-$1.sh 21 $LOGFILE - ERR=$? + if $REG_DIR/t-$1.sh 21 $LOGFILE; then + ERR=false + else + ERR=true + fi + cd - /dev/null - [ $? -ne 0 ] test_failed + $ERR test_failed diff -u t-$1.out $LOGFILE || test_failed echo done. -- 1.8.3.1 -- To unsubscribe from this list: send the line unsubscribe git in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[GUILT v4 13/33] Check that guilt header '.*' fails.
Signed-off-by: Per Cederqvist ced...@opera.com Signed-off-by: Josef 'Jeff' Sipek jef...@josefsipek.net --- regression/t-028.out | 7 +++ regression/t-028.sh | 4 2 files changed, 11 insertions(+) diff --git a/regression/t-028.out b/regression/t-028.out index 1564c09..ea72a3a 100644 --- a/regression/t-028.out +++ b/regression/t-028.out @@ -49,3 +49,10 @@ Signed-off-by: Commiter Name commiter@email % guilt header non-existant Patch non-existant is not in the series +% guilt header .* +.* does not uniquely identify a patch. Did you mean any of these? + modify + add + remove + mode + patch-with-some-desc diff --git a/regression/t-028.sh b/regression/t-028.sh index 88e9adb..2ce0378 100755 --- a/regression/t-028.sh +++ b/regression/t-028.sh @@ -31,4 +31,8 @@ done shouldfail guilt header non-existant +# This is an evil variant of a non-existant patch. However, this +# patch name is a regexp that just happens to match an existing patch. +shouldfail guilt header '.*' + # FIXME: how do we check that -e works? -- 1.8.3.1 -- To unsubscribe from this list: send the line unsubscribe git in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[GUILT v4 12/33] guilt header: more robust header selection.
If you run something like guilt header '.*' the command would crash, because the grep comand that tries to ensure that the patch exist would detect a match, but the later code expected the match to be exact. Fixed by comparing exact strings. And as a creeping feature guilt header will now try to use the supplied patch name as an unanchored regexp if no exact match was found. If the regexp yields a unique match, it is used; if more than one patch matches, the names of all patches are listed and the command fails. (Exercise left to the reader: generalized this so that guilt push also accepts a unique regular expression.) Signed-off-by: Per Cederqvist ced...@opera.com Signed-off-by: Josef 'Jeff' Sipek jef...@josefsipek.net --- guilt-header | 29 ++--- 1 file changed, 26 insertions(+), 3 deletions(-) diff --git a/guilt-header b/guilt-header index 41e00cc..c3d24f9 100755 --- a/guilt-header +++ b/guilt-header @@ -45,10 +45,33 @@ esac [ -z $patch ] die No patches applied. # check that patch exists in the series -ret=`get_full_series | grep -e ^$patch\$ | wc -l` -if [ $ret -eq 0 ]; then - die Patch $patch is not in the series +TMP_FULL_SERIES=`get_tmp_file series` +get_full_series $TMP_FULL_SERIES +found_patch= +while read x; do + if [ $x = $patch ]; then + found_patch=$patch + break + fi +done $TMP_FULL_SERIES +if [ -z $found_patch ]; then + TMP_MATCHES=`get_tmp_file series` + grep $patch $TMP_FULL_SERIES $TMP_MATCHES + nr=`wc -l $TMP_MATCHES` + if [ $nr -gt 1 ]; then + echo $patch does not uniquely identify a patch. Did you mean any of these? 2 + sed 's/^/ /' $TMP_MATCHES 2 + rm -f $TMP_MATCHES $TMP_FULL_SERIES + exit 1 + elif [ $nr -eq 0 ]; then + rm -f $TMP_MATCHES $TMP_FULL_SERIES + die Patch $patch is not in the series + fi + found_patch=`cat $TMP_MATCHES` + rm -f $TMP_MATCHES fi +rm -f $TMP_FULL_SERIES +patch=$found_patch # FIXME: warn if we're editing an applied patch -- 1.8.3.1 -- To unsubscribe from this list: send the line unsubscribe git in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[GUILT v4 14/33] Use git check-ref-format to validate patch names.
The valid_patchname now lets git check-ref-format do its job instead of trying (and failing) to implement the same rules. See git-check-ref-format(1) for a list of the rules. Re-implement rules added to git check-ref-format after Git 1.5.0, so that guilt rejects the same names no matter what version of Git we are using (but versions prior to 1.5.0 are not supported). Refer to the git-check-ref-format(1) man page in the error messages produced when valid_patchname indicates that the name is bad. Added testcases that breaks most of the rules in that man-page. Signed-off-by: Per Cederqvist ced...@opera.com --- guilt| 46 +- guilt-fork | 2 +- guilt-import | 2 +- guilt-new| 2 +- regression/t-025.out | 426 +-- regression/t-025.sh | 12 +- regression/t-032.out | 4 +- 7 files changed, 474 insertions(+), 20 deletions(-) diff --git a/guilt b/guilt index 3fc524e..9567a78 100755 --- a/guilt +++ b/guilt @@ -132,14 +132,50 @@ fi # usage: valid_patchname patchname valid_patchname() { + # Once we only support Git 1.7.8 and newer, the command below + # could be replaced with: + # + # git check-ref-format --allow-onelevel $1 + # + # Instead, we arbitrarily prepend one level. The result + # should be the same, and this is portable to all existing + # versions of Git. + git check-ref-format a/$1 + if [ $? -ne 0 ]; then + return 1 + fi + + # We want to reject all names that Git 2.0.0 rejects. In case + # we are running an older version, we explicitly check some + # cases that were added to Git after version 1.5.0. This code + # aims to support Git version 1.5.0 and newer. + + # Git 1.7.6.4 and newer rejects the DEL character. + if [ `echo $1|tr -d '\177'` != $1 ]; then + return 1 + fi + + # Git 1.7.8 and newer rejects refs that start or end with + # slash or contain multiple adjacent slashes. case $1 in - /*|./*|../*|*/./*|*/../*|*/.|*/..|*/|*\ *|*\*) + /*|*/|*//*) return 1;; - *:*) - return 1;; - *) - return 0;; esac + + # Git 1.7.8 and newer rejects refname components that end in + # .lock. + case $1 in + *.lock/*|*.lock) + return 1;; + esac + + # Git 1.8.5 and newer rejects refnames that are made up of the + # single character @. + if [ $1 = @ ]; then + return 1 + fi + + return 0 } get_branch() diff --git a/guilt-fork b/guilt-fork index a85d391..6447e55 100755 --- a/guilt-fork +++ b/guilt-fork @@ -37,7 +37,7 @@ else fi if ! valid_patchname $newpatch; then - die The specified patch name contains invalid characters (:). + die The specified patch name is invalid according to git-check-ref-format(1). fi if [ -e $GUILT_DIR/$branch/$newpatch ]; then diff --git a/guilt-import b/guilt-import index 3e9b3bb..928e325 100755 --- a/guilt-import +++ b/guilt-import @@ -40,7 +40,7 @@ if [ -e $GUILT_DIR/$branch/$newname ]; then fi if ! valid_patchname $newname; then - die The specified patch name contains invalid characters (:). + die The specified patch name is invalid according to git-check-ref-format(1). fi # create any directories as needed diff --git a/guilt-new b/guilt-new index 9528438..9f7fa44 100755 --- a/guilt-new +++ b/guilt-new @@ -64,7 +64,7 @@ fi if ! valid_patchname $patch; then disp Patchname is invalid. 2 - die it cannot begin with '/', './' or '../', or contain /./, /../, or whitespace + die It must follow the rules in git-check-ref-format(1). fi # create any directories as needed diff --git a/regression/t-025.out b/regression/t-025.out index 7811ab1..01bc406 100644 --- a/regression/t-025.out +++ b/regression/t-025.out @@ -141,7 +141,7 @@ f da39a3ee5e6b4b0d3255bfef95601890afd80709 .git/patches/master/prepend r acdeef96ee30eb34bbbf65d11de5cf7da4b5fee8 .git/refs/patches/master/prepend % guilt new white space Patchname is invalid. -it cannot begin with '/', './' or '../', or contain /./, /../, or whitespace +It must follow the rules in git-check-ref-format(1). % list_files d .git/patches d .git/patches/master @@ -211,7 +211,7 @@ f da39a3ee5e6b4b0d3255bfef95601890afd80709 .git/patches/master/prepend r acdeef96ee30eb34bbbf65d11de5cf7da4b5fee8 .git/refs/patches/master/prepend % guilt new /abc Patchname is invalid. -it cannot begin with '/', './' or '../', or contain /./, /../, or whitespace +It must follow the rules in git-check-ref-format(1). % list_files d .git/patches d .git/patches/master @@ -235,7 +235,7 @@ f da39a3ee5e6b4b0d3255bfef95601890afd80709 .git/patches/master/prepend r
[GUILT v4 11/33] test suite: remove pointless redirection.
The shouldfail function already redirects stderr to stdout, so there is no need to do the same in t-028.sh and t-021.sh. Signed-off-by: Per Cederqvist ced...@opera.com Signed-off-by: Josef 'Jeff' Sipek jef...@josefsipek.net --- regression/t-021.sh | 2 +- regression/t-025.sh | 2 +- regression/t-028.sh | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/regression/t-021.sh b/regression/t-021.sh index 6337d7b..614e870 100755 --- a/regression/t-021.sh +++ b/regression/t-021.sh @@ -61,7 +61,7 @@ for n in `_seq -2 $npatches`; do if [ $n -gt 0 ]; then cmd guilt pop -n $n else - shouldfail guilt pop -n $n 21 + shouldfail guilt pop -n $n fi cmd list_files diff --git a/regression/t-025.sh b/regression/t-025.sh index 3824608..985fed4 100755 --- a/regression/t-025.sh +++ b/regression/t-025.sh @@ -44,7 +44,7 @@ shouldfail guilt new white space cmd list_files for pname in prepend mode /abc ./blah ../blah abc/./blah abc/../blah abc/. abc/.. abc/ ; do - shouldfail guilt new $pname 21 + shouldfail guilt new $pname cmd list_files done diff --git a/regression/t-028.sh b/regression/t-028.sh index 8480100..88e9adb 100755 --- a/regression/t-028.sh +++ b/regression/t-028.sh @@ -29,6 +29,6 @@ guilt series | while read n; do cmd guilt header $n done -shouldfail guilt header non-existant 21 +shouldfail guilt header non-existant # FIXME: how do we check that -e works? -- 1.8.3.1 -- To unsubscribe from this list: send the line unsubscribe git in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[GUILT v4 15/33] Produce legal patch names in guilt-import-commit.
Try harder to create patch names that adhere to the rules in git-check-ref-format(1) when deriving a patch name from the commit message. Verify that the derived name using git check-ref-format, and as a final fallback simply use the patch name x (to ensure that the code is future-proof in case new rules are added in the future). Always append a .patch suffix to the patch name. Added test cases. Signed-off-by: Per Cederqvist ced...@opera.com Signed-off-by: Josef 'Jeff' Sipek jef...@josefsipek.net --- guilt-import-commit | 20 +- regression/t-034.out | 567 +++ regression/t-034.sh | 71 +++ 3 files changed, 656 insertions(+), 2 deletions(-) create mode 100644 regression/t-034.out create mode 100755 regression/t-034.sh diff --git a/guilt-import-commit b/guilt-import-commit index f14647c..6260c56 100755 --- a/guilt-import-commit +++ b/guilt-import-commit @@ -28,19 +28,35 @@ disp Current head: `git rev-parse \`git_branch\`` 2 for rev in `git rev-list $rhash`; do s=`git log --pretty=oneline -1 $rev | cut -c 42-` + # Try to convert the first line of the commit message to a + # valid patch name. fname=`echo $s | sed -e s//and/g -e s/[ :]/_/g -e s,[/\\],-,g \ -e s/['\\[{}]//g -e 's/]//g' -e 's/\*/-/g' \ - -e 's/\?/-/g' | tr A-Z a-z` + -e 's/\?/-/g' -e 's/\.\.\.*/./g' -e 's/^\.//' \ + -e 's/\.patch$//' -e 's/\.$//' | tr A-Z a-z` + + if ! valid_patchname $fname; then + # Try harder to make it a legal commit name by + # removing all but a few safe characters. + fname=`echo $fname|tr -d -c _a-zA-Z0-9---/\\n` + fi + if ! valid_patchname $fname; then + # If we failed to derive a legal patch name, use the + # name x. (If this happens, we likely have to + # append a suffix to make the name unique.) + fname=x + fi disp Converting `echo $rev | cut -c 1-8` as $fname mangle_prefix=1 fname_base=$fname - while [ -f $GUILT_DIR/$branch/$fname ]; do + while [ -f $GUILT_DIR/$branch/$fname.patch ]; do fname=$fname_base-$mangle_prefix mangle_prefix=`expr $mangle_prefix + 1` disp Patch under that name exists...trying '$fname' done + fname=$fname.patch ( do_make_header $rev diff --git a/regression/t-034.out b/regression/t-034.out new file mode 100644 index 000..7bc9459 --- /dev/null +++ b/regression/t-034.out @@ -0,0 +1,567 @@ +% setup_git_repo +% git tag base +% create_commit a The sequence /. is forbidden. +[master eebb76e] The sequence /. is forbidden. + Author: Author Name author@email + 1 file changed, 1 insertion(+) + create mode 100644 a +% create_commit a The sequence .lock/ is forbidden. +[master 45e81b5] The sequence .lock/ is forbidden. + Author: Author Name author@email + 1 file changed, 1 insertion(+) +% create_commit a A/component/may/not/end/in/foo.lock +[master bbf3f59] A/component/may/not/end/in/foo.lock + Author: Author Name author@email + 1 file changed, 1 insertion(+) +% create_commit a Two consecutive dots (..) is forbidden. +[master 1535e67] Two consecutive dots (..) is forbidden. + Author: Author Name author@email + 1 file changed, 1 insertion(+) +% create_commit a Check/multiple/../dots/./foo..patch +[master 48eb60c] Check/multiple/../dots/./foo..patch + Author: Author Name author@email + 1 file changed, 1 insertion(+) +% create_commit a Space is forbidden. +[master 10dea83] Space is forbidden. + Author: Author Name author@email + 1 file changed, 1 insertion(+) +% create_commit a Tilde~is~forbidden. +[master 70a83b7] Tilde~is~forbidden. + Author: Author Name author@email + 1 file changed, 1 insertion(+) +% create_commit a Caret^is^forbidden. +[master ee6ef2c] Caret^is^forbidden. + Author: Author Name author@email + 1 file changed, 1 insertion(+) +% create_commit a Colon:is:forbidden. +[master c077fe2] Colon:is:forbidden. + Author: Author Name author@email + 1 file changed, 1 insertion(+) +% create_commit a Delisforbidden. +[master 589ee30] Delisforbidden. + Author: Author Name author@email + 1 file changed, 1 insertion(+) +% git branch some-branch +% git tag some-tag +% create_commit a Ctrlisforbidden. +[master e63cdde] Ctrlisforbidden. + Author: Author Name author@email + 1 file changed, 1 insertion(+) +% create_commit a CR is also forbidden. +[master 21ad093] CR is also forbidden. + Author: Author Name author@email + 1 file changed, 1 insertion(+) +% create_commit a Question-mark?is?forbidden. +[master be2fa9b] Question-mark?is?forbidden. + Author: Author Name author@email + 1 file changed, 1 insertion(+) +% create_commit a Asterisk*is*forbidden. +[master af7b50f] Asterisk*is*forbidden. + Author: Author Name author@email + 1 file changed, 1 insertion
[GUILT v4 17/33] guilt graph no longer loops when no patches are applied.
Give an error message if no patches are applied. Added a test case that never terminates unless this fix is applied. Signed-off-by: Per Cederqvist ced...@opera.com Signed-off-by: Josef 'Jeff' Sipek jef...@josefsipek.net --- guilt-graph | 9 +++-- regression/t-033.out | 3 +++ regression/t-033.sh | 13 + 3 files changed, 23 insertions(+), 2 deletions(-) create mode 100644 regression/t-033.out create mode 100755 regression/t-033.sh diff --git a/guilt-graph b/guilt-graph index b3469dc..56d0e77 100755 --- a/guilt-graph +++ b/guilt-graph @@ -17,8 +17,13 @@ fi patchname=$1 -bottom=`git rev-parse refs/patches/$branch/$(head_n 1 $applied)` -base=`git rev-parse $bottom^` +bottompatch=$(head_n 1 $applied) +if [ -z $bottompatch ]; then + echo No patch applied. 2 + exit 1 +fi + +base=`git rev-parse refs/patches/${branch}/${bottompatch}^` if [ -z $patchname ]; then top=`git rev-parse HEAD` diff --git a/regression/t-033.out b/regression/t-033.out new file mode 100644 index 000..76613f9 --- /dev/null +++ b/regression/t-033.out @@ -0,0 +1,3 @@ +% setup_repo +% guilt graph +No patch applied. diff --git a/regression/t-033.sh b/regression/t-033.sh new file mode 100755 index 000..a3a8981 --- /dev/null +++ b/regression/t-033.sh @@ -0,0 +1,13 @@ +#!/bin/bash +# +# Test the graph code +# + +source $REG_DIR/scaffold + +cmd setup_repo + +# Check that guilt graph gives a proper No patch applied error +# message when no patches are applied. (An older version of guilt +# used to enter an endless loop in this situation.) +shouldfail guilt graph -- 1.8.3.1 -- To unsubscribe from this list: send the line unsubscribe git in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[GUILT v4 16/33] Fix backslash handling when creating names of imported patches.
The 'echo $s' construct sometimes processes escape sequences. (This happens, for instance, under Ubuntu 14.04 when /bin/sh is actually dash.) We don't want that to happen when we are importing commits, so use 'printf %s $s' instead. (The -E option of bash that explicitly disables backslash expansion is not portable; it is not supported by dash.) Signed-off-by: Per Cederqvist ced...@opera.com Signed-off-by: Josef 'Jeff' Sipek jef...@josefsipek.net --- guilt-import-commit | 2 +- regression/t-034.out | 14 +++--- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/guilt-import-commit b/guilt-import-commit index 6260c56..45f2404 100755 --- a/guilt-import-commit +++ b/guilt-import-commit @@ -30,7 +30,7 @@ for rev in `git rev-list $rhash`; do # Try to convert the first line of the commit message to a # valid patch name. - fname=`echo $s | sed -e s//and/g -e s/[ :]/_/g -e s,[/\\],-,g \ + fname=`printf %s $s | sed -e s//and/g -e s/[ :]/_/g -e s,[/\\],-,g \ -e s/['\\[{}]//g -e 's/]//g' -e 's/\*/-/g' \ -e 's/\?/-/g' -e 's/\.\.\.*/./g' -e 's/^\.//' \ -e 's/\.patch$//' -e 's/\.$//' | tr A-Z a-z` diff --git a/regression/t-034.out b/regression/t-034.out index 7bc9459..bda4399 100644 --- a/regression/t-034.out +++ b/regression/t-034.out @@ -236,7 +236,7 @@ Date: Mon Jan 1 00:00:00 2007 + About to begin conversion... Current head: 2a8b1889aa5066193bac978e6bf5073ffcfa6541 Converting 2a8b1889 as can-have-embedded-single-slashes -Converting 0a46f8fa as backslash-isorbidden +Converting 0a46f8fa as backslash-is-forbidden Converting aedb74fd as x Converting 30187ed0 as cannot@have@the@sequence@at-brace Converting 106e8e5a as cannot_end_in_ @@ -300,7 +300,7 @@ Applying patch..cannot@have@the@sequence@at-brace.patch Patch applied. Applying patch..x.patch Patch applied. -Applying patch..backslash-isorbidden.patch +Applying patch..backslash-is-forbidden.patch Patch applied. Applying patch..can-have-embedded-single-slashes.patch Patch applied. @@ -311,7 +311,7 @@ Date: Mon Jan 1 00:00:00 2007 + Can/have/embedded/single/slashes -commit 7c3ffa4f940c862e9f11f5d4a5ae421f7a8d3141 (refs/patches/master/backslash-isorbidden.patch) +commit 7c3ffa4f940c862e9f11f5d4a5ae421f7a8d3141 (refs/patches/master/backslash-is-forbidden.patch) Author: Author Name author@email Date: Mon Jan 1 00:00:00 2007 + @@ -518,8 +518,6 @@ d .git/patches/master d .git/refs/patches d .git/refs/patches/master f 06beca7069b9e576bd431f65d13862ed5d3e2a0f .git/patches/master/ctrlisforbidden.patch -f 08267ec6783ea9d1adae55b275198f7594764ed0 .git/patches/master/series -f 08267ec6783ea9d1adae55b275198f7594764ed0 .git/patches/master/status f 09b7e9be44ae5ec3a4bb30f5ee9d4ebc2c042f64 .git/patches/master/two_consecutive_dots_(.)_is_forbidden.patch f 0b971c9a17aeca2319c93d700ffd98acc2a93451 .git/patches/master/question-mark-is-forbidden.patch f 2b8392f63d61efc12add554555adae30883993cc .git/patches/master/cannot-end-in-slash-.patch @@ -529,7 +527,7 @@ f 34e07c584032df137f19bdb66d93f316f00a5ac8 .git/patches/master/tildeisforbidden f 49bab499826b63deb2bd704629d60c7268c57aee .git/patches/master/the_sequence_-._is_forbidden.patch f 5bcddb8ccb6e6e5e8a61e9e56cb2e0f70cbab2f5 .git/patches/master/cannot@have@the@sequence@at-brace.patch f 637b982fe14a240de181ae63226b27e0c406b3dc .git/patches/master/asterisk-is-forbidden.patch -f 698f8a7d41a64e3b6be1a3eba86574078b22a5f3 .git/patches/master/backslash-isorbidden.patch +f 698f8a7d41a64e3b6be1a3eba86574078b22a5f3 .git/patches/master/backslash-is-forbidden.patch f 7b103c3c7ae298cd2334f6f49da48bae1424f77b .git/patches/master/crisalsoforbidden.patch f 9b810b8c63779c51d2e7f61ab59cd49835041563 .git/patches/master/x.patch f a22958d9ae9976fd7b2b5a9d0bcd44bf7ad9b08a .git/patches/master/caretisforbidden.patch @@ -537,6 +535,8 @@ f ab325bf5a432937fc6f231d3e8a773a62d53952b .git/patches/master/multiple-slashes f cb9cffbd4465bddee266c20ccebd14eb687eaa89 .git/patches/master/delisforbidden.patch f d0885a1a1fdee0fd1e4fedce3f7acd3100540bc4 .git/patches/master/openbracketisforbidden.patch f d2903523fb66a346596eabbdd1bda4e52b266440 .git/patches/master/check-multiple-.-dots-.-foo.patch +f da90de1c84138194524994e0bc3bc4ca8189c999 .git/patches/master/series +f da90de1c84138194524994e0bc3bc4ca8189c999 .git/patches/master/status f dfc11f76394059909671af036598c5fbe33001ba .git/patches/master/space_is_forbidden.patch f e47474c52d6c893f36d0457f885a6dd1267742bb .git/patches/master/colon_is_forbidden.patch f e7a5f8912592d9891e6159f5827c8b4f372cc406 .git/patches/master/the_sequence_.lock-_is_forbidden.patch @@ -548,7 +548,7 @@ r 1626a11d979a1e9e775c766484172212277153df .git/refs/patches/master/asterisk-is r 3a0d5ccef0359004fcaa9cee98fbd6a2c4432e74 .git/refs/patches/master/tildeisforbidden.patch r 434e07cacdd8e7eb4723e67cb2d100b3a4121a3a
[GUILT v4 19/33] Check that guilt graph works when working on a branch with a comma.
git branch names can contain commas. Check that guilt graph works even in that case. Signed-off-by: Per Cederqvist ced...@opera.com Signed-off-by: Josef 'Jeff' Sipek jef...@josefsipek.net --- regression/t-033.out | 65 regression/t-033.sh | 39 +++ 2 files changed, 104 insertions(+) diff --git a/regression/t-033.out b/regression/t-033.out index 76613f9..3d1c61f 100644 --- a/regression/t-033.out +++ b/regression/t-033.out @@ -1,3 +1,68 @@ % setup_repo % guilt graph No patch applied. +%% Testing branch a,graph +% git checkout -b a,graph master +Switched to a new branch 'a,graph' +% guilt init +% guilt new a.patch +% guilt pop +All patches popped. +% guilt push +Applying patch..a.patch +Patch applied. +% guilt graph +digraph G { +# checking rev 95275d7c05c6a6176d3941374115b91272877f6c + 95275d7c05c6a6176d3941374115b91272877f6c [label=a.patch] +} +% git add file.txt +% guilt refresh +Patch a.patch refreshed +% guilt pop +All patches popped. +% guilt push +Applying patch..a.patch +Patch applied. +% guilt graph +digraph G { +# checking rev ff2775f8d1dc753f635830adcc3a067e0b681e2d + ff2775f8d1dc753f635830adcc3a067e0b681e2d [label=a.patch] +} +%% Adding an unrelated file in a new patch. No deps. +% guilt new b.patch +% git add file2.txt +% guilt refresh +Patch b.patch refreshed +% guilt pop +Now at a.patch. +% guilt push +Applying patch..b.patch +Patch applied. +% guilt graph +digraph G { +# checking rev c7014443c33d2b0237293687ceb9cbd38313df65 + c7014443c33d2b0237293687ceb9cbd38313df65 [label=b.patch] +# checking rev ff2775f8d1dc753f635830adcc3a067e0b681e2d + ff2775f8d1dc753f635830adcc3a067e0b681e2d [label=a.patch] +} +%% Changing a file already changed in the first patch adds a dependency. +% guilt new c.patch +% git add file.txt +% guilt refresh +Patch c.patch refreshed +% guilt pop +Now at b.patch. +% guilt push +Applying patch..c.patch +Patch applied. +% guilt graph +digraph G { +# checking rev 891bc14b5603474c9743fd04f3da888644413dc5 + 891bc14b5603474c9743fd04f3da888644413dc5 [label=c.patch] +# checking rev c7014443c33d2b0237293687ceb9cbd38313df65 + c7014443c33d2b0237293687ceb9cbd38313df65 [label=b.patch] +# checking rev ff2775f8d1dc753f635830adcc3a067e0b681e2d + ff2775f8d1dc753f635830adcc3a067e0b681e2d [label=a.patch] + 891bc14b5603474c9743fd04f3da888644413dc5 - ff2775f8d1dc753f635830adcc3a067e0b681e2d; // ? +} diff --git a/regression/t-033.sh b/regression/t-033.sh index a3a8981..fac081e 100755 --- a/regression/t-033.sh +++ b/regression/t-033.sh @@ -3,6 +3,13 @@ # Test the graph code # +function fixup_time_info +{ + cmd guilt pop + touch -a -m -t $TOUCH_DATE .git/patches/a,graph/$1 + cmd guilt push +} + source $REG_DIR/scaffold cmd setup_repo @@ -11,3 +18,35 @@ cmd setup_repo # message when no patches are applied. (An older version of guilt # used to enter an endless loop in this situation.) shouldfail guilt graph + +echo %% Testing branch a,graph +cmd git checkout -b a,graph master + +cmd guilt init + +cmd guilt new a.patch + +fixup_time_info a.patch +cmd guilt graph + +cmd echo a file.txt +cmd git add file.txt +cmd guilt refresh +fixup_time_info a.patch +cmd guilt graph + +echo %% Adding an unrelated file in a new patch. No deps. +cmd guilt new b.patch +cmd echo b file2.txt +cmd git add file2.txt +cmd guilt refresh +fixup_time_info b.patch +cmd guilt graph + +echo %% Changing a file already changed in the first patch adds a dependency. +cmd guilt new c.patch +cmd echo c file.txt +cmd git add file.txt +cmd guilt refresh +fixup_time_info c.patch +cmd guilt graph -- 1.8.3.1 -- To unsubscribe from this list: send the line unsubscribe git in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[GUILT v4 18/33] guilt-graph: Handle commas in branch names.
This fix relies on the fact that git branch names can not contain :. Signed-off-by: Per Cederqvist ced...@opera.com Signed-off-by: Josef 'Jeff' Sipek jef...@josefsipek.net --- guilt-graph | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/guilt-graph b/guilt-graph index 56d0e77..924a63e 100755 --- a/guilt-graph +++ b/guilt-graph @@ -51,7 +51,7 @@ safebranch=`echo $branch|sed 's%/%/%g'` while [ $current != $base ]; do pname=`git show-ref | sed -n -e /^$current refs\/patches\/$safebranch/ { - s,^$current refs/patches/$branch/,, + s:^$current refs/patches/$branch/:: p q }` -- 1.8.3.1 -- To unsubscribe from this list: send the line unsubscribe git in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[GUILT v4 20/33] guilt graph: Handle patch names containing quotes.
Quote quotes with a backslash in the guilt graph output. Otherwise, the dot file could contain syntax errors. Added a test case. Signed-off-by: Per Cederqvist ced...@opera.com Signed-off-by: Josef 'Jeff' Sipek jef...@josefsipek.net --- guilt-graph | 2 ++ regression/t-033.out | 22 ++ regression/t-033.sh | 9 + 3 files changed, 33 insertions(+) diff --git a/guilt-graph b/guilt-graph index 924a63e..0857e0d 100755 --- a/guilt-graph +++ b/guilt-graph @@ -57,6 +57,8 @@ while [ $current != $base ]; do }` [ -z $pname ] pname=? + pname=`printf \%s\ \$pname\ | sed 's/\/\/g'` + disp # checking rev $current disp \$current\ [label=\$pname\] diff --git a/regression/t-033.out b/regression/t-033.out index 3d1c61f..c120d4f 100644 --- a/regression/t-033.out +++ b/regression/t-033.out @@ -66,3 +66,25 @@ digraph G { ff2775f8d1dc753f635830adcc3a067e0b681e2d [label=a.patch] 891bc14b5603474c9743fd04f3da888644413dc5 - ff2775f8d1dc753f635830adcc3a067e0b681e2d; // ? } +% guilt new a-betterquicker'-patch.patch +% git add file.txt +% guilt refresh +Patch a-betterquicker'-patch.patch refreshed +% guilt pop +Now at c.patch. +% guilt push +Applying patch..a-betterquicker'-patch.patch +Patch applied. +% guilt graph +digraph G { +# checking rev bc7df666a646739eaf559af23cab72f2bfd01f0e + bc7df666a646739eaf559af23cab72f2bfd01f0e [label=a-\betterquicker'-patch.patch] +# checking rev 891bc14b5603474c9743fd04f3da888644413dc5 + 891bc14b5603474c9743fd04f3da888644413dc5 [label=c.patch] + bc7df666a646739eaf559af23cab72f2bfd01f0e - 891bc14b5603474c9743fd04f3da888644413dc5; // ? +# checking rev c7014443c33d2b0237293687ceb9cbd38313df65 + c7014443c33d2b0237293687ceb9cbd38313df65 [label=b.patch] +# checking rev ff2775f8d1dc753f635830adcc3a067e0b681e2d + ff2775f8d1dc753f635830adcc3a067e0b681e2d [label=a.patch] + 891bc14b5603474c9743fd04f3da888644413dc5 - ff2775f8d1dc753f635830adcc3a067e0b681e2d; // ? +} diff --git a/regression/t-033.sh b/regression/t-033.sh index fac081e..9fe1827 100755 --- a/regression/t-033.sh +++ b/regression/t-033.sh @@ -50,3 +50,12 @@ cmd git add file.txt cmd guilt refresh fixup_time_info c.patch cmd guilt graph + +# A patch name that contains funky characters, including unbalanced +# quotes. +cmd guilt new a-\betterquicker'-patch.patch +cmd echo d file.txt +cmd git add file.txt +cmd guilt refresh +fixup_time_info a-\betterquicker'-patch.patch +cmd guilt graph -- 1.8.3.1 -- To unsubscribe from this list: send the line unsubscribe git in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[GUILT v4 21/33] The log.decorate setting should not influence import-commit.
Use --no-decorate in the call to git log that tries to read the commit message to produce patch names. Otherwise, if the user has set log.decorate to short or full, the patch name will be less useful. Modify the t-034.sh test case to demonstrate that this is needed. Signed-off-by: Per Cederqvist ced...@opera.com Signed-off-by: Josef 'Jeff' Sipek jef...@josefsipek.net --- guilt-import-commit | 2 +- regression/t-034.out | 2 ++ regression/t-034.sh | 2 ++ 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/guilt-import-commit b/guilt-import-commit index 45f2404..1da7c8e 100755 --- a/guilt-import-commit +++ b/guilt-import-commit @@ -26,7 +26,7 @@ disp About to begin conversion... 2 disp Current head: `git rev-parse \`git_branch\`` 2 for rev in `git rev-list $rhash`; do - s=`git log --pretty=oneline -1 $rev | cut -c 42-` + s=`git log --no-decorate --pretty=oneline -1 $rev | cut -c 42-` # Try to convert the first line of the commit message to a # valid patch name. diff --git a/regression/t-034.out b/regression/t-034.out index bda4399..5d81bd4 100644 --- a/regression/t-034.out +++ b/regression/t-034.out @@ -232,6 +232,7 @@ Date: Mon Jan 1 00:00:00 2007 + Signed-off-by: Commiter Name commiter@email % guilt init +% git config log.decorate short % guilt import-commit base..HEAD About to begin conversion... Current head: 2a8b1889aa5066193bac978e6bf5073ffcfa6541 @@ -259,6 +260,7 @@ Converting 45e81b51 as the_sequence_.lock-_is_forbidden Converting eebb76e9 as the_sequence_-._is_forbidden Done. Current head: d4850419ccc1146c7169f500725ce504b9774ed0 +% git config log.decorate no % guilt push -a Applying patch..the_sequence_-._is_forbidden.patch Patch applied. diff --git a/regression/t-034.sh b/regression/t-034.sh index f41f958..648d009 100755 --- a/regression/t-034.sh +++ b/regression/t-034.sh @@ -57,7 +57,9 @@ cmd git log # Import all the commits to guilt. cmd guilt init +cmd git config log.decorate short cmd guilt import-commit base..HEAD +cmd git config log.decorate no for patch in .git/patches/master/*.patch; do touch -a -m -t $TOUCH_DATE $patch -- 1.8.3.1 -- To unsubscribe from this list: send the line unsubscribe git in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[GUILT v4 22/33] The log.decorate setting should not influence patchbomb.
Signed-off-by: Per Cederqvist ced...@opera.com Signed-off-by: Josef 'Jeff' Sipek jef...@josefsipek.net --- guilt-patchbomb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/guilt-patchbomb b/guilt-patchbomb index 1231418..164b10c 100755 --- a/guilt-patchbomb +++ b/guilt-patchbomb @@ -47,7 +47,7 @@ if [ $? -ne 0 ]; then fi # display the list of commits to be sent as patches -git log --pretty=oneline $r | cut -c 1-8,41- | $pager +git log --no-decorate --pretty=oneline $r | cut -c 1-8,41- | $pager _disp Are these what you want to send? [Y/n] read n -- 1.8.3.1 -- To unsubscribe from this list: send the line unsubscribe git in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[GUILT v4 23/33] The log.decorate setting should not influence guilt rebase.
Signed-off-by: Per Cederqvist ced...@opera.com Signed-off-by: Josef 'Jeff' Sipek jef...@josefsipek.net --- guilt-rebase | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/guilt-rebase b/guilt-rebase index fd28e48..a1714a0 100755 --- a/guilt-rebase +++ b/guilt-rebase @@ -66,7 +66,7 @@ pop_all_patches git merge --no-commit $upstream /dev/null 2 /dev/null disp -log=`git log -1 --pretty=oneline` +log=`git log -1 --no-decorate --pretty=oneline` disp HEAD is now at `echo $log | cut -c 1-7`... `echo $log | cut -c 41-` # -- 1.8.3.1 -- To unsubscribe from this list: send the line unsubscribe git in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[GUILT v4 25/33] guilt push now fails when there are no more patches to push.
This makes it easier to script operations on the entire queue, for example run the test suite on each patch in the queue: guilt pop -a;while guilt push; do make test||break; done This brings guilt push in line with the push operation in Mercurial Queues (hg qpush), which fails when there are no patches to apply. Updated the test suite. guilt push -a still does not fail. (It successfully manages to ensure that all patches are pushed, even if it did not have to do anything to make it so.) Signed-off-by: Per Cederqvist ced...@opera.com Signed-off-by: Josef 'Jeff' Sipek jef...@josefsipek.net --- guilt-push | 19 ++- regression/t-020.out | 89 regression/t-020.sh | 13 +++- 3 files changed, 113 insertions(+), 8 deletions(-) diff --git a/guilt-push b/guilt-push index 67687e7..39c125e 100755 --- a/guilt-push +++ b/guilt-push @@ -56,6 +56,12 @@ fi patch=$1 [ ! -z $all ] patch=-a +# Treat guilt push as guilt push -n 1. +if [ -z $patch ]; then + patch=1 + num=t +fi + if [ $patch = -a ]; then # we are supposed to push all patches, get the last one out of # series @@ -65,7 +71,7 @@ if [ $patch = -a ]; then die There are no patches to push. fi elif [ ! -z $num ]; then - # we are supposed to pop a set number of patches + # we are supposed to push a set number of patches [ $patch -lt 0 ] die Invalid number of patches to push. @@ -78,11 +84,6 @@ elif [ ! -z $num ]; then # clamp to minimum [ $tidx -lt $eidx ] eidx=$tidx -elif [ -z $patch ]; then - # we are supposed to push only the next patch onto the stack - - eidx=`wc -l $applied` - eidx=`expr $eidx + 1` else # we're supposed to push only up to a patch, make sure the patch is # in the series @@ -109,7 +110,11 @@ if [ $sidx -gt $eidx ]; then else disp File series fully applied, ends at patch `get_series | tail -n 1` fi - exit 0 + if [ -n $all ]; then + exit 0 + else + exit 1 + fi fi get_series | sed -n -e ${sidx},${eidx}p | while read p diff --git a/regression/t-020.out b/regression/t-020.out index 42433dc..bcb8797 100644 --- a/regression/t-020.out +++ b/regression/t-020.out @@ -270,6 +270,95 @@ index 000..8baef1b +++ b/def @@ -0,0 +1 @@ +abc +% guilt push +File series fully applied, ends at patch mode +% guilt push -a +File series fully applied, ends at patch mode +% list_files +d .git/patches +d .git/patches/master +d .git/refs/patches +d .git/refs/patches/master +f 22930c6d1f1938f298a4fca51c57e4b47171db21 .git/patches/master/mode +f 413390f3906f16f30b054a4fb86c1e014b964504 .git/patches/master/remove +f 71596bf71b72c2717e1aee378aabefbfa19ab7c8 .git/patches/master/status +f 9c18cc7abe6b87f18503714a80a677b4094eb457 .git/patches/master/add +f bacb4aad8a55fe4e7aa58a9ae169990bb764069f .git/patches/master/series +f bc9ab2e0f5db99d483961e956e814d963f0309f8 .git/patches/master/modify +r 33633e7a1aa31972f125878baf7807be57b1672d .git/refs/patches/master/modify +r 37d588cc39848368810e88332bd03b083f2ce3ac .git/refs/patches/master/add +r ccd56089d1b5305a9d35617cb7f6f4b06ffa68ba .git/refs/patches/master/mode +r ffb7faa126a6d91bcdd44a494f76b96dd860b8b9 .git/refs/patches/master/remove +% git log -p +commit ccd56089d1b5305a9d35617cb7f6f4b06ffa68ba +Author: Author Name author@email +Date: Mon Jan 1 00:00:00 2007 + + +patch mode + +diff --git a/def b/def +old mode 100644 +new mode 100755 + +commit ffb7faa126a6d91bcdd44a494f76b96dd860b8b9 +Author: Author Name author@email +Date: Mon Jan 1 00:00:00 2007 + + +patch remove + +diff --git a/abd b/abd +deleted file mode 100644 +index fd3896d..000 +--- a/abd /dev/null +@@ -1 +0,0 @@ +-öuؽáZâñeÏÈE£WÀV¼/U?Ú|¢@6¤8'H¸1G_ͧ*·ðRÒ¤ ªÂ~· +\ No newline at end of file + +commit 37d588cc39848368810e88332bd03b083f2ce3ac +Author: Author Name author@email +Date: Mon Jan 1 00:00:00 2007 + + +patch add + +diff --git a/abd b/abd +new file mode 100644 +index 000..fd3896d +--- /dev/null b/abd +@@ -0,0 +1 @@ ++öuؽáZâñeÏÈE£WÀV¼/U?Ú|¢@6¤8'H¸1G_ͧ*·ðRÒ¤ ªÂ~· +\ No newline at end of file + +commit 33633e7a1aa31972f125878baf7807be57b1672d +Author: Author Name author@email +Date: Mon Jan 1 00:00:00 2007 + + +patch modify + +diff --git a/def b/def +index 8baef1b..7d69c2f 100644 +--- a/def b/def +@@ -1 +1,2 @@ + abc ++asjhfksad + +commit d4850419ccc1146c7169f500725ce504b9774ed0 +Author: Author Name author@email +Date: Mon Jan 1 00:00:00 2007 + + +initial + +Signed-off-by: Commiter Name commiter@email + +diff --git a/def b/def +new file mode 100644 +index 000..8baef1b +--- /dev/null b/def +@@ -0,0 +1 @@ ++abc % guilt pop --all All patches popped. % guilt push diff --git a/regression/t-020.sh b/regression/t-020.sh index
[GUILT v4 26/33] guilt pop now fails when there are no more patches to pop.
This is analogous to how guilt push now fails when there are no more patches to push. Like push, the --all argument still succeeds even if there was no need to pop anything. Updated the test suite. Signed-off-by: Per Cederqvist ced...@opera.com Signed-off-by: Josef 'Jeff' Sipek jef...@josefsipek.net --- guilt-pop| 17 +++-- regression/t-021.out | 2 ++ regression/t-021.sh | 6 ++ regression/t-061.sh | 6 +- 4 files changed, 24 insertions(+), 7 deletions(-) diff --git a/guilt-pop b/guilt-pop index f0e647f..191313e 100755 --- a/guilt-pop +++ b/guilt-pop @@ -49,9 +49,19 @@ fi patch=$1 [ ! -z $all ] patch=-a +# Treat guilt pop as guilt pop -n 1. +if [ -z $patch ]; then + patch=1 + num=t +fi + if [ ! -s $applied ]; then disp No patches applied. - exit 0 + if [ $patch = -a ]; then + exit 0 + else + exit 1 + fi elif [ $patch = -a ]; then # we are supposed to pop all patches @@ -68,11 +78,6 @@ elif [ ! -z $num ]; then # catch underflow [ $eidx -lt 0 ] eidx=0 [ $eidx -eq $sidx ] die No patches requested to be removed. -elif [ -z $patch ]; then - # we are supposed to pop only the current patch on the stack - - sidx=`wc -l $applied` - eidx=`expr $sidx - 1` else # we're supposed to pop only up to a patch, make sure the patch is # in the series diff --git a/regression/t-021.out b/regression/t-021.out index 9b42d9c..58be12f 100644 --- a/regression/t-021.out +++ b/regression/t-021.out @@ -287,6 +287,8 @@ index 000..8baef1b +++ b/def @@ -0,0 +1 @@ +abc +% guilt pop +No patches applied. % guilt push --all Applying patch..modify Patch applied. diff --git a/regression/t-021.sh b/regression/t-021.sh index 614e870..e0d2dc1 100755 --- a/regression/t-021.sh +++ b/regression/t-021.sh @@ -23,6 +23,12 @@ guilt series | _tac | while read n ; do done # +# pop when there is nothing to pop +# + +shouldfail guilt pop + +# # push all # cmd guilt push --all diff --git a/regression/t-061.sh b/regression/t-061.sh index 1411baa..6192f1b 100755 --- a/regression/t-061.sh +++ b/regression/t-061.sh @@ -48,7 +48,11 @@ cmd list_files for i in `seq 5` do - cmd guilt pop + if [ $i -ge 5 ]; then + shouldfail guilt pop + else + cmd guilt pop + fi cmd git for-each-ref cmd guilt push cmd git for-each-ref -- 1.8.3.1 -- To unsubscribe from this list: send the line unsubscribe git in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[GUILT v4 27/33] Minor testsuite fix.
Fix remove_topic() in t-061.sh so that it doesn't print a git hash. Signed-off-by: Per Cederqvist ced...@opera.com Signed-off-by: Josef 'Jeff' Sipek jef...@josefsipek.net --- regression/t-061.out | 1 - regression/t-061.sh | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/regression/t-061.out b/regression/t-061.out index ef0f335..60ad56d 100644 --- a/regression/t-061.out +++ b/regression/t-061.out @@ -381,7 +381,6 @@ ccd56089d1b5305a9d35617cb7f6f4b06ffa68ba commit refs/patches/master/mode ffb7faa126a6d91bcdd44a494f76b96dd860b8b9 commit refs/patches/master/remove % guilt pop -a No patches applied. -ccd56089d1b5305a9d35617cb7f6f4b06ffa68ba % git checkout guilt/master Switched to branch guilt/master % guilt pop -a diff --git a/regression/t-061.sh b/regression/t-061.sh index 6192f1b..db26e12 100755 --- a/regression/t-061.sh +++ b/regression/t-061.sh @@ -15,7 +15,7 @@ old_style_branch() { remove_topic() { cmd guilt pop -a - if git rev-parse --verify --quiet guilt/master + if git rev-parse --verify --quiet guilt/master /dev/null then cmd git checkout guilt/master else -- 1.8.3.1 -- To unsubscribe from this list: send the line unsubscribe git in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[GUILT v4 28/33] Fix coding style errors in t-061.sh.
Signed-off-by: Per Cederqvist ced...@opera.com Signed-off-by: Josef 'Jeff' Sipek jef...@josefsipek.net --- regression/t-061.sh | 6 ++ 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/regression/t-061.sh b/regression/t-061.sh index db26e12..bda50c7 100755 --- a/regression/t-061.sh +++ b/regression/t-061.sh @@ -15,8 +15,7 @@ old_style_branch() { remove_topic() { cmd guilt pop -a - if git rev-parse --verify --quiet guilt/master /dev/null - then + if git rev-parse --verify --quiet guilt/master /dev/null; then cmd git checkout guilt/master else cmd git checkout master @@ -46,8 +45,7 @@ cmd git for-each-ref cmd list_files -for i in `seq 5` -do +for i in `seq 5`; do if [ $i -ge 5 ]; then shouldfail guilt pop else -- 1.8.3.1 -- To unsubscribe from this list: send the line unsubscribe git in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[GUILT v4 29/33] Added guilt.reusebranch configuration option.
When the option is true, Guilt does not create a new Git branch when patches are applied. This way, you can switch between Guilt 0.35 and the current version of Guilt with no issues. By default, the option is false, so that all users will immediately get the added protection against pushing a branch upstream with a patch applied. While this might break guilt if a user is running both version 0.35 and the current version against the same local repository, it will not lead to data loss, and that situation is probably rare. Signed-off-by: Per Cederqvist ced...@opera.com Signed-off-by: Josef 'Jeff' Sipek jef...@josefsipek.net --- guilt| 24 ++- regression/scaffold | 1 + regression/t-062.out | 420 +++ regression/t-062.sh | 130 4 files changed, 569 insertions(+), 6 deletions(-) create mode 100644 regression/t-062.out create mode 100755 regression/t-062.sh diff --git a/guilt b/guilt index 0500500..ea9d131 100755 --- a/guilt +++ b/guilt @@ -884,6 +884,9 @@ guilt_push_diff_context=1 # default diffstat value: true or false DIFFSTAT_DEFAULT=false +# default guilt.reusebranch value: true or false +REUSE_BRANCH_DEFAULT=false + # Prefix for guilt branches. GUILT_PREFIX=guilt/ @@ -895,6 +898,10 @@ GUILT_PREFIX=guilt/ diffstat=`git config --bool guilt.diffstat` [ -z $diffstat ] diffstat=$DIFFSTAT_DEFAULT +# reuse Git branch? +reuse_branch=`git config --bool guilt.reusebranch` +[ -z $reuse_branch ] reuse_branch=$REUSE_BRANCH_DEFAULT + # # The following gets run every time this file is source'd # @@ -959,13 +966,18 @@ else die Unsupported operating system: $UNAME_S fi -if [ $branch = $raw_git_branch ] [ -n `get_top 2/dev/null` ] -then -# This is for compat with old repositories that still have a -# pushed patch without the new-style branch prefix. -old_style_prefix=true +if [ -n `get_top 2/dev/null` ]; then + # If there is at least one pushed patch, we set + # old_style_prefix according to how it was pushed. It is only + # possible to change the prefix style while no patches are + # applied. + if [ $branch = $raw_git_branch ]; then + old_style_prefix=true + else + old_style_prefix=false + fi else -old_style_prefix=false + old_style_prefix=$reuse_branch fi _main $@ diff --git a/regression/scaffold b/regression/scaffold index 2e04c83..b3135be 100644 --- a/regression/scaffold +++ b/regression/scaffold @@ -97,6 +97,7 @@ function setup_git_repo git config log.date default git config log.decorate no git config guilt.diffstat false + git config guilt.reusebranch false } function setup_guilt_repo diff --git a/regression/t-062.out b/regression/t-062.out new file mode 100644 index 000..ad5c081 --- /dev/null +++ b/regression/t-062.out @@ -0,0 +1,420 @@ +% setup_repo +% git config guilt.reusebranch true +% guilt push -a +Applying patch..modify +Patch applied. +Applying patch..add +Patch applied. +Applying patch..remove +Patch applied. +Applying patch..mode +Patch applied. +% list_files +d .git/patches +d .git/patches/master +d .git/refs/patches +d .git/refs/patches/master +f 22930c6d1f1938f298a4fca51c57e4b47171db21 .git/patches/master/mode +f 413390f3906f16f30b054a4fb86c1e014b964504 .git/patches/master/remove +f 71596bf71b72c2717e1aee378aabefbfa19ab7c8 .git/patches/master/status +f 9c18cc7abe6b87f18503714a80a677b4094eb457 .git/patches/master/add +f bacb4aad8a55fe4e7aa58a9ae169990bb764069f .git/patches/master/series +f bc9ab2e0f5db99d483961e956e814d963f0309f8 .git/patches/master/modify +r 33633e7a1aa31972f125878baf7807be57b1672d .git/refs/patches/master/modify +r 37d588cc39848368810e88332bd03b083f2ce3ac .git/refs/patches/master/add +r ccd56089d1b5305a9d35617cb7f6f4b06ffa68ba .git/refs/patches/master/mode +r ffb7faa126a6d91bcdd44a494f76b96dd860b8b9 .git/refs/patches/master/remove +% git for-each-ref +ccd56089d1b5305a9d35617cb7f6f4b06ffa68ba commitrefs/heads/master +37d588cc39848368810e88332bd03b083f2ce3ac commitrefs/patches/master/add +ccd56089d1b5305a9d35617cb7f6f4b06ffa68ba commitrefs/patches/master/mode +33633e7a1aa31972f125878baf7807be57b1672d commit refs/patches/master/modify +ffb7faa126a6d91bcdd44a494f76b96dd860b8b9 commit refs/patches/master/remove +% guilt pop +Now at remove. +% git for-each-ref +ffb7faa126a6d91bcdd44a494f76b96dd860b8b9 commitrefs/heads/master +37d588cc39848368810e88332bd03b083f2ce3ac commitrefs/patches/master/add +33633e7a1aa31972f125878baf7807be57b1672d commit refs/patches/master/modify +ffb7faa126a6d91bcdd44a494f76b96dd860b8b9 commit refs/patches/master/remove +% guilt push +Applying patch..mode +Patch applied. +% git for-each-ref +ccd56089d1b5305a9d35617cb7f6f4b06ffa68ba commitrefs/heads/master +37d588cc39848368810e88332bd03b083f2ce3ac commitrefs/patches
[GUILT v4 30/33] Added a short style guide, and Emacs settings.
Signed-off-by: Per Cederqvist ced...@opera.com Signed-off-by: Josef 'Jeff' Sipek jef...@josefsipek.net --- .dir-locals.el | 3 +++ Documentation/Contributing | 15 +++ 2 files changed, 18 insertions(+) create mode 100644 .dir-locals.el diff --git a/.dir-locals.el b/.dir-locals.el new file mode 100644 index 000..50ef2b7 --- /dev/null +++ b/.dir-locals.el @@ -0,0 +1,3 @@ +((nil . ((indent-tabs-mode . t) +(tab-width . 8))) + (sh-mode . ((sh-basic-offset . 8 diff --git a/Documentation/Contributing b/Documentation/Contributing index abf3480..0da49d6 100644 --- a/Documentation/Contributing +++ b/Documentation/Contributing @@ -4,6 +4,21 @@ Documentation/SubmittingPatches file. :) 1) Hack on the code a bit +Please follow this style guide: + + - Use tabs for indentation. + + - Put then on the same line as if. + + - Follow the style of the existing code, except if it breaks the + above guidlines. + + - If you change the code to conform to the style guide, please do so + in a separate commit that does not change anything else. + +Please check that you change does not break make test. Please add +new testcases for any new functionality, and if you fix a bug. + 2) Make a patch: Use diff -up or diff -uprN to create patches. Or simply use git to -- 1.8.3.1 -- To unsubscribe from this list: send the line unsubscribe git in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[GUILT v4 32/33] Improved doc and tests for guilt header.
--- Documentation/guilt-header.txt | 5 - regression/t-028.out | 9 + regression/t-028.sh| 3 +++ 3 files changed, 16 insertions(+), 1 deletion(-) diff --git a/Documentation/guilt-header.txt b/Documentation/guilt-header.txt index 870bfaf..71b2e66 100644 --- a/Documentation/guilt-header.txt +++ b/Documentation/guilt-header.txt @@ -18,7 +18,10 @@ Prints either the topmost patch's header or the header of a specified patch. -E:: Open the raw patch in an editor, instead of printing it. patchname:: - Name of the patch. + Name of the patch. If a patch with exactly this name exists, + use it. Otherwise, treat the name as a regexp; if the regexp + matches a single patch, use it. Otherwise, list all matching + patch names to stderr and fail. Author -- diff --git a/regression/t-028.out b/regression/t-028.out index ea72a3a..39ac900 100644 --- a/regression/t-028.out +++ b/regression/t-028.out @@ -56,3 +56,12 @@ Patch non-existant is not in the series remove mode patch-with-some-desc +% guilt header de +de does not uniquely identify a patch. Did you mean any of these? + mode + patch-with-some-desc +% guilt header des +blah blah blah + +Signed-off-by: Commiter Name commiter@email + diff --git a/regression/t-028.sh b/regression/t-028.sh index 2ce0378..cd3088c 100755 --- a/regression/t-028.sh +++ b/regression/t-028.sh @@ -35,4 +35,7 @@ shouldfail guilt header non-existant # patch name is a regexp that just happens to match an existing patch. shouldfail guilt header '.*' +shouldfail guilt header de +cmd guilt header des + # FIXME: how do we check that -e works? -- 1.8.3.1 -- To unsubscribe from this list: send the line unsubscribe git in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[GUILT v4 33/33] Document the exit status of guilt push and guilt pop.
--- Documentation/guilt-pop.txt | 3 +++ Documentation/guilt-push.txt | 3 +++ 2 files changed, 6 insertions(+) diff --git a/Documentation/guilt-pop.txt b/Documentation/guilt-pop.txt index 36fea9e..b0b89cc 100644 --- a/Documentation/guilt-pop.txt +++ b/Documentation/guilt-pop.txt @@ -26,6 +26,9 @@ OPTIONS If no patchname is given, pop the top-most patch. +Exit with a non-zero exit status if requested to pop more patches +than there are on the stack. + Author -- Written by Josef Jeff Sipek jef...@josefsipek.net diff --git a/Documentation/guilt-push.txt b/Documentation/guilt-push.txt index 6ee86b9..6439f21 100644 --- a/Documentation/guilt-push.txt +++ b/Documentation/guilt-push.txt @@ -26,6 +26,9 @@ OPTIONS If no patchname is given, push the next patch in the series onto the tree. +Exit with a non-zero exit status if requested to push more patches +than there are in the series. + Author -- Written by Josef Jeff Sipek jef...@josefsipek.net -- 1.8.3.1 -- To unsubscribe from this list: send the line unsubscribe git in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [GUILT v2 12/29] guilt header: more robust header selection.
On Fri, May 16, 2014 at 12:46 AM, Jeff Sipek jef...@josefsipek.net wrote: On Tue, May 13, 2014 at 10:30:48PM +0200, Per Cederqvist wrote: If you run something like guilt header '.*' the command would crash, because the grep comand that tries to ensure that the patch exist would detect a match, but the later code expected the match to be exact. Fixed by comparing exact strings. And as a creeping feature guilt header will now try to use the supplied patch name as an unachored regexp if no exact match was found. If the regexp yields a unique match, it is used; if more than one patch matches, the names of all patches are listed and the command fails. (Exercise left to the reader: generalized this so that guilt push also accepts a unique regular expression.) Signed-off-by: Per Cederqvist ced...@opera.com --- guilt-header | 28 +--- 1 file changed, 25 insertions(+), 3 deletions(-) diff --git a/guilt-header b/guilt-header index 41e00cc..4701b31 100755 --- a/guilt-header +++ b/guilt-header @@ -45,10 +45,32 @@ esac [ -z $patch ] die No patches applied. # check that patch exists in the series -ret=`get_full_series | grep -e ^$patch\$ | wc -l` -if [ $ret -eq 0 ]; then - die Patch $patch is not in the series +full_series=`get_tmp_file series` +get_full_series $full_series +found_patch= +while read x; do + if [ $x = $patch ]; then + found_patch=$patch + break + fi +done $full_series We have to use a temp file instead of a 'get_full_series | while read x; do ...' because that'd create a subshell, correct? Yes. Also (and probably less importantly) we sometimes need to run grep on the same output (see the creation of TMP_MATCHES below) and it would be a bit wasteful to run get_full_series twice. (The assumption is that it is cheaper to create a temp file than to recompute the value. I have not measured this, though.) +if [ -z $found_patch ]; then + TMP_MATCHES=`get_tmp_file series` + grep $patch $full_series $TMP_MATCHES + nr=`wc -l $TMP_MATCHES` + if [ $nr -gt 1 ]; then + echo $patch does not uniquely identify a patch. Did you mean any of these? 2 + sed 's/^/ /' $TMP_MATCHES 2 + rm -f $TMP_MATCHES + exit 1 + elif [ $nr -eq 0 ]; then + rm -f $TMP_MATCHES + die Patch $patch is not in the series + fi + found_patch=`cat $TMP_MATCHES` + rm -f $TMP_MATCHES fi +patch=$found_patch Do we not delete $full_series? Good catch. Will fix in the next version of the series. I'll also rename the variable $TMP_FULL_SERIES to adhere to the apparent coding style. (But I will not fix guilt-patchbomb that uses $dir as a temporary variable.) /ceder # FIXME: warn if we're editing an applied patch -- 1.8.3.1 -- OpenIndiana ibdm: 8 cores, 12 GB RAM -- To unsubscribe from this list: send the line unsubscribe git in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[GUILT v3 01/31] The tests should not fail if guilt.diffstat is set.
Explicitly set guilt.diffstat to its default value. Without this, the 027 test (and possibly others) fail if guilt.diffstat is set to true in ~/.gitconfig. Signed-off-by: Per Cederqvist ced...@opera.com Signed-off-by: Josef 'Jeff' Sipek jef...@josefsipek.net --- regression/scaffold | 1 + 1 file changed, 1 insertion(+) diff --git a/regression/scaffold b/regression/scaffold index 546d8c6..5c8b73e 100644 --- a/regression/scaffold +++ b/regression/scaffold @@ -87,6 +87,7 @@ function setup_git_repo # Explicitly set config that the tests rely on. git config log.date default git config log.decorate no + git config guilt.diffstat false } function setup_guilt_repo -- 1.8.3.1 -- To unsubscribe from this list: send the line unsubscribe git in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[GUILT v3 02/31] Allow guilt delete -f to run from a dir which contains spaces.
Signed-off-by: Per Cederqvist ced...@opera.com Signed-off-by: Josef 'Jeff' Sipek jef...@josefsipek.net --- guilt-delete | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/guilt-delete b/guilt-delete index 3e394f8..967ac10 100755 --- a/guilt-delete +++ b/guilt-delete @@ -49,7 +49,7 @@ series_remove_patch $patch guilt_hook delete $patch -[ ! -z $force ] rm -f $GUILT_DIR/$branch/$patch +[ ! -z $force ] rm -f $GUILT_DIR/$branch/$patch exit 0 -- 1.8.3.1 -- To unsubscribe from this list: send the line unsubscribe git in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[GUILT v3 00/31] Teach guilt import-commit how to create legal patch names, and more
This is version 3 of the patch series I sent back on 21 Mar 2014. I have addressed all feedback to date, updated the coding style, and added signed-off-by lines from Jeff Sipek for those commits that I have received an explicit approval from him (but only if I have not made any other change to that particular commit). I have added two new patches: * Patch 28/31 fixes coding style issues in t-061.sh. I inserted it before the new patch 29/31 since 29/31 copies t-061.sh as t-062.sh, and by fixing the style issues in the origin it is easier to track the changes. This means that v2 patches 28 and 29 are now numbered 29 and 30. Sorry about that. * Patch 31/31 removes all use of git log -p in the test suite. To see how the patches have evolved, you might find http://www.lysator.liu.se/~ceder/guilt-oslo-2014-v3/ useful. It displays diffs of all the patches between v2 and v3, in pdiffdiff output format. Here is the original blurb for the series, slightly edited: I recently found myself sitting on a train with a computer in front of me. I tried to use guilt import-commit, which seemed to work, but when I tried to guilt push the commits I had just imported I got some errors. It turned out that guilt import-commit had generated invalid patch names. I decided to fix the issue, and write a test case that demonstrated the problem. One thing led to another, and here I am, a few late nights at a hotel and a return trip on the train later, submitting a patch series in 28 parts. Sorry about the number of patches, but this is what happens when you uncover a bug while writing a test case for the bug you uncovered while writing a test case for your original problem. The patch series consists of: - A number of fixes to the test suite. - A number of bug fixes which I hope are non-controversial. Most of the fixes have test cases. - Changed behavior: guilt push when there is nothing more to push now uses exit status 1. This makes it possible to write shell loops such as while guilt push; do make test||break; done. Also, guilt pop when no patches are applied also uses exit status 1. (This aligns guilt push and guilt pop with how hg qpush and hg qpop has worked for several years.) - Changed behavior: by default, guilt no longer changes branch when you push a patch. You need to do git config guilt.reusebranch false to re-enable that. This patch sets the default value of guilt.reusebranch to true; it should in my opinion change to false a year or two after the next release. - The humble beginnings of a coding style guide. A more detailed overview of the patches: 1. Some tests fail if git config guilt.diffstat true is in effect. 2-4. Some commands fail if run from a directory with spaces in its name. 5. guilt new had an overly restrictive argument parser. 6-8. guilt.diffstat could break guilt fold and guilt new. 9-10. The test suite did not test exit status properly. 11. Remove pointless redirections in the test suite. 12-13. guilt header tried to check if a patch existed, but the check was broken. 14-16. Various parts of guilt tried to ensure that patch names were legal git branch names, but failed. 17-20. guilt graph failed when no patch was applied, and when a branch name contained a comma or a quote. 21-23. git config log.decorate short caused guilt import-commit, guilt patchbomb and guilt rebase to fail in various ways. 24. Patches may contain backslashes, but various informative messages from guilt did backslash processing. 25-26. guilt push and guilt pop should fail when there is nothing to do. 28. Fix coding style problems in a test case. 27, 29. These two commits were things I intended to contribute a while back, when contributing the Change git branch when patches are applied change (commit 67d3af63f422). These commits makes that behavior optional, and it defaults to being disabled, so that you can use both Guilt v0.35 (and earlier) and the current Guilt code against the same repo. These commits add some code complexity, and you might want to skip them if you think the current behavior is better. 30. A coding style guide, with Emacs support. 31. Avoid using git log -p. This patch series is also available on http://repo.or.cz/w/guilt/ceder.git in the oslo-2014-v3 branch. If you already have a copy of guilt, you should be able to fetch that branch with something like: git remote add ceder http://repo.or.cz/r/guilt/ceder.git git fetch ceder refs/heads/oslo-2014-v3:refs/remotes/ceder/oslo-2014-v3 A few of the regression/t-*.out files contain non-ASCII characters. I hope they survive the mail transfer; if not, please use the repo above to fetch the commits. Per Cederqvist (31): The tests should not fail if guilt.diffstat is set. Allow guilt delete -f to run from a dir which contains spaces. Added test case for guilt delete -f. Allow
[GUILT v3 04/31] Allow guilt import-commit to run from a dir which contains spaces.
Signed-off-by: Per Cederqvist ced...@opera.com Signed-off-by: Josef 'Jeff' Sipek jef...@josefsipek.net --- guilt-import-commit | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/guilt-import-commit b/guilt-import-commit index 20dcee2..f14647c 100755 --- a/guilt-import-commit +++ b/guilt-import-commit @@ -23,7 +23,7 @@ if ! must_commit_first; then fi disp About to begin conversion... 2 -disp Current head: `cat $GIT_DIR/refs/heads/\`git_branch\`` 2 +disp Current head: `git rev-parse \`git_branch\`` 2 for rev in `git rev-list $rhash`; do s=`git log --pretty=oneline -1 $rev | cut -c 42-` @@ -46,7 +46,7 @@ for rev in `git rev-list $rhash`; do do_make_header $rev echo git diff --binary $rev^..$rev - ) $GUILT_DIR/$branch/$fname + ) $GUILT_DIR/$branch/$fname # FIXME: grab the GIT_AUTHOR_DATE from the commit object and set the # timestamp on the patch @@ -68,6 +68,6 @@ for rev in `git rev-list $rhash`; do done disp Done. 2 -disp Current head: `cat $GIT_DIR/refs/heads/\`git_branch\`` 2 +disp Current head: `git rev-parse \`git_branch\`` 2 } -- 1.8.3.1 -- To unsubscribe from this list: send the line unsubscribe git in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[GUILT v3 06/31] Fix the do_get_patch function.
A patch file consists of: (1) the description (2) optional diffstat (3) the patches When extracting the patch, we only want part 3. The do_get_patch used to give us part 2 and part 3. That made for instance this series of operations fail if guilt.diffstat is true: $ guilt new empty-1 $ guilt new empty-2 $ guilt pop Now at empty-1 $ guilt fold empty-2 $ guilt pop All patches popped. $ guilt push Applying patch..empty-1 fatal: unrecognized input To force apply this patch, use 'guilt push -f' Signed-off-by: Per Cederqvist ced...@opera.com Signed-off-by: Josef 'Jeff' Sipek jef...@josefsipek.net --- guilt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/guilt b/guilt index 8701481..3fc524e 100755 --- a/guilt +++ b/guilt @@ -334,7 +334,7 @@ do_get_patch() { awk ' BEGIN{} -/^(diff |---$|--- )/ {patch = 1} +/^(diff |--- )/ {patch = 1} patch == 1 {print $0} END{} ' $1 -- 1.8.3.1 -- To unsubscribe from this list: send the line unsubscribe git in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[GUILT v3 03/31] Added test case for guilt delete -f.
Ensure that the file really is deleted. Signed-off-by: Per Cederqvist ced...@opera.com Signed-off-by: Josef 'Jeff' Sipek jef...@josefsipek.net --- regression/t-026.out | 15 +++ regression/t-026.sh | 5 - 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/regression/t-026.out b/regression/t-026.out index 3b9fb14..be50b48 100644 --- a/regression/t-026.out +++ b/regression/t-026.out @@ -29,3 +29,18 @@ f 7848194fd2e9ee0eb6589482900687d799d60a12 .git/patches/master/series f 9c18cc7abe6b87f18503714a80a677b4094eb457 .git/patches/master/add f bc9ab2e0f5db99d483961e956e814d963f0309f8 .git/patches/master/modify f da39a3ee5e6b4b0d3255bfef95601890afd80709 .git/patches/master/status +% guilt new delete-me +% guilt pop +All patches popped. +% guilt delete -f delete-me +% list_files +d .git/patches +d .git/patches/master +d .git/refs/patches +d .git/refs/patches/master +f 22930c6d1f1938f298a4fca51c57e4b47171db21 .git/patches/master/mode +f 413390f3906f16f30b054a4fb86c1e014b964504 .git/patches/master/remove +f 7848194fd2e9ee0eb6589482900687d799d60a12 .git/patches/master/series +f 9c18cc7abe6b87f18503714a80a677b4094eb457 .git/patches/master/add +f bc9ab2e0f5db99d483961e956e814d963f0309f8 .git/patches/master/modify +f da39a3ee5e6b4b0d3255bfef95601890afd80709 .git/patches/master/status diff --git a/regression/t-026.sh b/regression/t-026.sh index 0ccdf85..e25d0df 100755 --- a/regression/t-026.sh +++ b/regression/t-026.sh @@ -20,4 +20,7 @@ cmd guilt delete add cmd list_files -# FIXME: test delete -f +cmd guilt new delete-me +cmd guilt pop +cmd guilt delete -f delete-me +cmd list_files -- 1.8.3.1 -- To unsubscribe from this list: send the line unsubscribe git in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[GUILT v3 05/31] guilt new: Accept more than 4 arguments.
The argument parser arbitrarily refused to accept more than 4 arguments. That made it impossible to run guilt new -f -s -m msg patch. Removed the checks for the number of arguments from the guilt new parser -- the other checks that are already there are enough to catch all errors. Give a better error message if -m isn't followed by a message argument. Signed-off-by: Per Cederqvist ced...@opera.com Signed-off-by: Josef 'Jeff' Sipek jef...@josefsipek.net --- guilt-new | 7 +++ 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/guilt-new b/guilt-new index bb68924..9528438 100755 --- a/guilt-new +++ b/guilt-new @@ -11,10 +11,6 @@ fi _main() { -if [ $# -lt 1 ] || [ $# -gt 4 ]; then - usage -fi - while [ $# -gt 0 ] ; do case $1 in -f) @@ -31,6 +27,9 @@ while [ $# -gt 0 ] ; do fi ;; -m) + if [ $# -eq 1 ]; then + usage + fi msg=$2 shift -- 1.8.3.1 -- To unsubscribe from this list: send the line unsubscribe git in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[GUILT v3 07/31] Added test cases for guilt fold.
Test that we can combine any combination of patches with empty and non-empty messages, both with and without guilt.diffstat. (All patches are empty.) Signed-off-by: Per Cederqvist ced...@opera.com Signed-off-by: Josef 'Jeff' Sipek jef...@josefsipek.net --- regression/t-035.out | 467 +++ regression/t-035.sh | 61 +++ 2 files changed, 528 insertions(+) create mode 100644 regression/t-035.out create mode 100755 regression/t-035.sh diff --git a/regression/t-035.out b/regression/t-035.out new file mode 100644 index 000..cc16fb4 --- /dev/null +++ b/regression/t-035.out @@ -0,0 +1,467 @@ +% setup_repo +% git config guilt.diffstat true +%% empty + empty (diffstat=true) +% guilt new empty-1 +% guilt pop +All patches popped. +% guilt push +Applying patch..empty-1 +Patch applied. +% guilt new empty-2 +% guilt pop +Now at empty-1. +% guilt push +Applying patch..empty-2 +Patch applied. +% guilt pop +Now at empty-1. +% guilt fold empty-2 +% guilt pop +All patches popped. +% guilt push +Applying patch..empty-1 +Patch applied. +% list_files +d .git/patches +d .git/patches/master +d .git/refs/patches +d .git/refs/patches/master +f 22930c6d1f1938f298a4fca51c57e4b47171db21 .git/patches/master/mode +f 413390f3906f16f30b054a4fb86c1e014b964504 .git/patches/master/remove +f 4ea806e306f0228a8ef41f186035e7b04097f1f2 .git/patches/master/status +f 7d261b8caad0f161c21daf5de65eeb521ff8c067 .git/patches/master/empty-1 +f 9c18cc7abe6b87f18503714a80a677b4094eb457 .git/patches/master/add +f bc9ab2e0f5db99d483961e956e814d963f0309f8 .git/patches/master/modify +f d28d87b88c1e24d637e390dc3603cfa7c1715711 .git/patches/master/series +f da39a3ee5e6b4b0d3255bfef95601890afd80709 .git/patches/master/empty-1~ +f da39a3ee5e6b4b0d3255bfef95601890afd80709 .git/patches/master/empty-2~ +r bde3d337af70f36836ad606c800d194006f883b3 .git/refs/patches/master/empty-1 +% guilt pop +All patches popped. +% guilt delete -f empty-1 +% list_files +d .git/patches +d .git/patches/master +d .git/refs/patches +d .git/refs/patches/master +f 22930c6d1f1938f298a4fca51c57e4b47171db21 .git/patches/master/mode +f 413390f3906f16f30b054a4fb86c1e014b964504 .git/patches/master/remove +f 9c18cc7abe6b87f18503714a80a677b4094eb457 .git/patches/master/add +f bacb4aad8a55fe4e7aa58a9ae169990bb764069f .git/patches/master/series +f bc9ab2e0f5db99d483961e956e814d963f0309f8 .git/patches/master/modify +f da39a3ee5e6b4b0d3255bfef95601890afd80709 .git/patches/master/empty-1~ +f da39a3ee5e6b4b0d3255bfef95601890afd80709 .git/patches/master/empty-2~ +f da39a3ee5e6b4b0d3255bfef95601890afd80709 .git/patches/master/status +%% empty + nonempty (diffstat=true) +% guilt new empty +% guilt pop +All patches popped. +% guilt push +Applying patch..empty +Patch applied. +% guilt new -f -s -m A commit message. nonempty +% guilt pop +Now at empty. +% guilt push +Applying patch..nonempty +Patch applied. +% guilt pop +Now at empty. +% guilt fold nonempty +% guilt pop +All patches popped. +% guilt push +Applying patch..empty +Patch applied. +% list_files +d .git/patches +d .git/patches/master +d .git/refs/patches +d .git/refs/patches/master +f 15aab0fd8b937eb3bb01841693f35dcb75da2faf .git/patches/master/status +f 22930c6d1f1938f298a4fca51c57e4b47171db21 .git/patches/master/mode +f 413390f3906f16f30b054a4fb86c1e014b964504 .git/patches/master/remove +f 51fcfcf16db2903f19ab4a4a3caacd297ea9f6cd .git/patches/master/empty~ +f 51fcfcf16db2903f19ab4a4a3caacd297ea9f6cd .git/patches/master/nonempty~ +f 683678040eef9334d6329e00d5b9babda3e65b57 .git/patches/master/empty +f 9c18cc7abe6b87f18503714a80a677b4094eb457 .git/patches/master/add +f a26a22287b500a2a372e42c2bab03599bbe37cdf .git/patches/master/series +f bc9ab2e0f5db99d483961e956e814d963f0309f8 .git/patches/master/modify +f da39a3ee5e6b4b0d3255bfef95601890afd80709 .git/patches/master/empty-1~ +f da39a3ee5e6b4b0d3255bfef95601890afd80709 .git/patches/master/empty-2~ +r 4eedaa32894fc07af3298d8c1178052942a3ca6a .git/refs/patches/master/empty +% guilt pop +All patches popped. +% guilt delete -f empty +% list_files +d .git/patches +d .git/patches/master +d .git/refs/patches +d .git/refs/patches/master +f 22930c6d1f1938f298a4fca51c57e4b47171db21 .git/patches/master/mode +f 413390f3906f16f30b054a4fb86c1e014b964504 .git/patches/master/remove +f 51fcfcf16db2903f19ab4a4a3caacd297ea9f6cd .git/patches/master/empty~ +f 51fcfcf16db2903f19ab4a4a3caacd297ea9f6cd .git/patches/master/nonempty~ +f 9c18cc7abe6b87f18503714a80a677b4094eb457 .git/patches/master/add +f bacb4aad8a55fe4e7aa58a9ae169990bb764069f .git/patches/master/series +f bc9ab2e0f5db99d483961e956e814d963f0309f8 .git/patches/master/modify +f da39a3ee5e6b4b0d3255bfef95601890afd80709 .git/patches/master/empty-1~ +f da39a3ee5e6b4b0d3255bfef95601890afd80709 .git/patches/master/empty-2~ +f da39a3ee5e6b4b0d3255bfef95601890afd80709 .git/patches/master/status +%% nonempty + empty (diffstat=true) +% guilt new -f -s -m A commit
[GUILT v3 08/31] Added more test cases for guilt new: empty patches.
Test that empty patches are handled correctly, both with and without the guilt.diffstat configuration option. Signed-off-by: Per Cederqvist ced...@opera.com --- regression/t-020.out | 269 +++ regression/t-020.sh | 60 2 files changed, 329 insertions(+) diff --git a/regression/t-020.out b/regression/t-020.out index af45734..42433dc 100644 --- a/regression/t-020.out +++ b/regression/t-020.out @@ -1128,3 +1128,272 @@ f 9c18cc7abe6b87f18503714a80a677b4094eb457 .git/patches/master/add f bacb4aad8a55fe4e7aa58a9ae169990bb764069f .git/patches/master/series f bc9ab2e0f5db99d483961e956e814d963f0309f8 .git/patches/master/modify f da39a3ee5e6b4b0d3255bfef95601890afd80709 .git/patches/master/status +% guilt new empty.patch +% guilt pop +All patches popped. +% guilt push +Applying patch..empty.patch +Patch applied. +% list_files +d .git/patches +d .git/patches/master +d .git/refs/patches +d .git/refs/patches/master +f 22930c6d1f1938f298a4fca51c57e4b47171db21 .git/patches/master/mode +f 413390f3906f16f30b054a4fb86c1e014b964504 .git/patches/master/remove +f 9c18cc7abe6b87f18503714a80a677b4094eb457 .git/patches/master/add +f bc9ab2e0f5db99d483961e956e814d963f0309f8 .git/patches/master/modify +f d15a1d2d34493f790c78ddacb8815b0b9536ee2b .git/patches/master/series +f da39a3ee5e6b4b0d3255bfef95601890afd80709 .git/patches/master/empty.patch +f e90b964f01cbef60bbe00c38c55d9ea86618a66a .git/patches/master/status +r c7a139f532a43c3c8b0e068cac04f8f6af0f94e1 .git/refs/patches/master/empty.patch +% git log -p +commit c7a139f532a43c3c8b0e068cac04f8f6af0f94e1 +Author: Author Name author@email +Date: Mon Jan 1 00:00:00 2007 + + +patch empty.patch + +commit d4850419ccc1146c7169f500725ce504b9774ed0 +Author: Author Name author@email +Date: Mon Jan 1 00:00:00 2007 + + +initial + +Signed-off-by: Commiter Name commiter@email + +diff --git a/def b/def +new file mode 100644 +index 000..8baef1b +--- /dev/null b/def +@@ -0,0 +1 @@ ++abc +% git config guilt.diffstat true +% guilt refresh +Patch empty.patch refreshed +% guilt pop +All patches popped. +% guilt push +Applying patch..empty.patch +Patch applied. +% list_files +d .git/patches +d .git/patches/master +d .git/refs/patches +d .git/refs/patches/master +f 22930c6d1f1938f298a4fca51c57e4b47171db21 .git/patches/master/mode +f 413390f3906f16f30b054a4fb86c1e014b964504 .git/patches/master/remove +f 7d261b8caad0f161c21daf5de65eeb521ff8c067 .git/patches/master/empty.patch +f 9c18cc7abe6b87f18503714a80a677b4094eb457 .git/patches/master/add +f bc9ab2e0f5db99d483961e956e814d963f0309f8 .git/patches/master/modify +f d15a1d2d34493f790c78ddacb8815b0b9536ee2b .git/patches/master/series +f da39a3ee5e6b4b0d3255bfef95601890afd80709 .git/patches/master/empty.patch~ +f e90b964f01cbef60bbe00c38c55d9ea86618a66a .git/patches/master/status +r c7a139f532a43c3c8b0e068cac04f8f6af0f94e1 .git/refs/patches/master/empty.patch +% git log -p +commit c7a139f532a43c3c8b0e068cac04f8f6af0f94e1 +Author: Author Name author@email +Date: Mon Jan 1 00:00:00 2007 + + +patch empty.patch + +commit d4850419ccc1146c7169f500725ce504b9774ed0 +Author: Author Name author@email +Date: Mon Jan 1 00:00:00 2007 + + +initial + +Signed-off-by: Commiter Name commiter@email + +diff --git a/def b/def +new file mode 100644 +index 000..8baef1b +--- /dev/null b/def +@@ -0,0 +1 @@ ++abc +% git config guilt.diffstat false +% guilt pop +All patches popped. +% guilt push +Applying patch..empty.patch +Patch applied. +% list_files +d .git/patches +d .git/patches/master +d .git/refs/patches +d .git/refs/patches/master +f 22930c6d1f1938f298a4fca51c57e4b47171db21 .git/patches/master/mode +f 413390f3906f16f30b054a4fb86c1e014b964504 .git/patches/master/remove +f 7ad87a0bdb8cf0a57cfc384633edabbb9c2bfa1b .git/patches/master/empty.patch +f 9c18cc7abe6b87f18503714a80a677b4094eb457 .git/patches/master/add +f bc9ab2e0f5db99d483961e956e814d963f0309f8 .git/patches/master/modify +f d15a1d2d34493f790c78ddacb8815b0b9536ee2b .git/patches/master/series +f da39a3ee5e6b4b0d3255bfef95601890afd80709 .git/patches/master/empty.patch~ +f e90b964f01cbef60bbe00c38c55d9ea86618a66a .git/patches/master/status +r 8ed27228b117c0c88abf3d586bcc43c68e975cea .git/refs/patches/master/empty.patch +% git log -p +commit 8ed27228b117c0c88abf3d586bcc43c68e975cea +Author: Per Cederqvist ce...@lysator.liu.se +Date: Mon Jan 1 00:00:00 2007 + + +Fix a bug. + +This commit fixes a serious bug. + +FIXME: +- add a test case +- track down the bug +- actually fix it + +commit d4850419ccc1146c7169f500725ce504b9774ed0 +Author: Author Name author@email +Date: Mon Jan 1 00:00:00 2007 + + +initial + +Signed-off-by: Commiter Name commiter@email + +diff --git a/def b/def +new file mode 100644 +index 000..8baef1b +--- /dev/null b/def +@@ -0,0 +1 @@ ++abc +% git config
[GUILT v3 09/31] Test suite: properly check the exit status of commands.
The cmd and shouldfail functions checked the exit status of the replace_path function instead of the actual command that was running. (The $? construct checks the exit status of the last command in a pipeline, not the first command.) Updated t-032.sh, which used shouldfail instead of cmd in one place. (The comment in the script makes it clear that the command is expected to succeed.) Signed-off-by: Per Cederqvist ced...@opera.com --- regression/scaffold | 17 +++-- regression/t-032.sh | 2 +- 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/regression/scaffold b/regression/scaffold index 5c8b73e..e4d7487 100644 --- a/regression/scaffold +++ b/regression/scaffold @@ -51,18 +51,23 @@ function filter_dd function cmd { echo % $@ - $@ 21 | replace_path return 0 - return 1 + ( + exec 31 + rv=`(($@ 21; echo $? 4) | replace_path 3 ) 41` + exit $rv + ) + return $? } # usage: shouldfail cmd.. function shouldfail { echo % $@ - ( - $@ 21 || return 0 - return 1 - ) | replace_path + ! ( + exec 31 + rv=`(($@ 21; echo $? 4) | replace_path 3 ) 41` + exit $rv + ) return $? } diff --git a/regression/t-032.sh b/regression/t-032.sh index b1d5f19..bba401e 100755 --- a/regression/t-032.sh +++ b/regression/t-032.sh @@ -28,7 +28,7 @@ shouldfail guilt import -P foo3 foo cmd guilt import -P foo2 foo # ok -shouldfail guilt import foo +cmd guilt import foo # duplicate patch name (implicit) shouldfail guilt import foo -- 1.8.3.1 -- To unsubscribe from this list: send the line unsubscribe git in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[GUILT v3 11/31] test suite: remove pointless redirection.
The shouldfail function already redirects stderr to stdout, so there is no need to do the same in t-028.sh and t-021.sh. Signed-off-by: Per Cederqvist ced...@opera.com Signed-off-by: Josef 'Jeff' Sipek jef...@josefsipek.net --- regression/t-021.sh | 2 +- regression/t-025.sh | 2 +- regression/t-028.sh | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/regression/t-021.sh b/regression/t-021.sh index 6337d7b..614e870 100755 --- a/regression/t-021.sh +++ b/regression/t-021.sh @@ -61,7 +61,7 @@ for n in `_seq -2 $npatches`; do if [ $n -gt 0 ]; then cmd guilt pop -n $n else - shouldfail guilt pop -n $n 21 + shouldfail guilt pop -n $n fi cmd list_files diff --git a/regression/t-025.sh b/regression/t-025.sh index 3824608..985fed4 100755 --- a/regression/t-025.sh +++ b/regression/t-025.sh @@ -44,7 +44,7 @@ shouldfail guilt new white space cmd list_files for pname in prepend mode /abc ./blah ../blah abc/./blah abc/../blah abc/. abc/.. abc/ ; do - shouldfail guilt new $pname 21 + shouldfail guilt new $pname cmd list_files done diff --git a/regression/t-028.sh b/regression/t-028.sh index 8480100..88e9adb 100755 --- a/regression/t-028.sh +++ b/regression/t-028.sh @@ -29,6 +29,6 @@ guilt series | while read n; do cmd guilt header $n done -shouldfail guilt header non-existant 21 +shouldfail guilt header non-existant # FIXME: how do we check that -e works? -- 1.8.3.1 -- To unsubscribe from this list: send the line unsubscribe git in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[GUILT v3 10/31] Run test_failed if the exit status of a test script is bad.
There were two problems with the old code: - Since set -e is in effect (that is set in scaffold) the run-test script exited immediately if a t-*.sh script failed. This is not nice, as we want the error report that test_failed prints. - The code ran cd - between running the t-*.sh script and checking the exit status, so the exit status was lost. (Actually, the exit status was saved in $ERR, but nothing ever looked at $ERR.) Signed-off-by: Per Cederqvist ced...@opera.com Signed-off-by: Josef 'Jeff' Sipek jef...@josefsipek.net --- regression/run-tests | 10 +++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/regression/run-tests b/regression/run-tests index a10e796..8e0af9f 100755 --- a/regression/run-tests +++ b/regression/run-tests @@ -55,11 +55,15 @@ function run_test # run the test cd $REPODIR /dev/null - $REG_DIR/t-$1.sh 21 $LOGFILE - ERR=$? + if $REG_DIR/t-$1.sh 21 $LOGFILE; then + ERR=false + else + ERR=true + fi + cd - /dev/null - [ $? -ne 0 ] test_failed + $ERR test_failed diff -u t-$1.out $LOGFILE || test_failed echo done. -- 1.8.3.1 -- To unsubscribe from this list: send the line unsubscribe git in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[GUILT v3 14/31] Use git check-ref-format to validate patch names.
The valid_patchname now lets git check-ref-format do its job instead of trying (and failing) to implement the same rules. See git-check-ref-format(1) for a list of the rules. Refer to the git-check-ref-format(1) man page in the error messages produced when valid_patchname indicates that the name is bad. Added testcases that breaks most of the rules in that man-page. Git version 1.8.5 no longer allows the single character @ as a branch name. Guilt always rejects that name, for increased compatibility. Signed-off-by: Per Cederqvist ced...@opera.com Signed-off-by: Josef 'Jeff' Sipek jef...@josefsipek.net --- guilt| 21 ++- guilt-fork | 2 +- guilt-import | 2 +- guilt-new| 2 +- regression/t-025.out | 426 +-- regression/t-025.sh | 12 +- regression/t-032.out | 4 +- 7 files changed, 446 insertions(+), 23 deletions(-) diff --git a/guilt b/guilt index 3fc524e..23cc2da 100755 --- a/guilt +++ b/guilt @@ -132,14 +132,19 @@ fi # usage: valid_patchname patchname valid_patchname() { - case $1 in - /*|./*|../*|*/./*|*/../*|*/.|*/..|*/|*\ *|*\*) - return 1;; - *:*) - return 1;; - *) - return 0;; - esac + if git check-ref-format --allow-onelevel $1; then + # Starting with Git version 1.8.5, a branch cannot be + # the single character @. Make sure guilt rejects + # that name even if we are currently using an older + # version of Git. This ensures that the test suite + # runs fine using any version of Git. + if [ $1 = @ ]; then + return 1 + fi + return 0 + else + return 1 + fi } get_branch() diff --git a/guilt-fork b/guilt-fork index a85d391..6447e55 100755 --- a/guilt-fork +++ b/guilt-fork @@ -37,7 +37,7 @@ else fi if ! valid_patchname $newpatch; then - die The specified patch name contains invalid characters (:). + die The specified patch name is invalid according to git-check-ref-format(1). fi if [ -e $GUILT_DIR/$branch/$newpatch ]; then diff --git a/guilt-import b/guilt-import index 3e9b3bb..928e325 100755 --- a/guilt-import +++ b/guilt-import @@ -40,7 +40,7 @@ if [ -e $GUILT_DIR/$branch/$newname ]; then fi if ! valid_patchname $newname; then - die The specified patch name contains invalid characters (:). + die The specified patch name is invalid according to git-check-ref-format(1). fi # create any directories as needed diff --git a/guilt-new b/guilt-new index 9528438..9f7fa44 100755 --- a/guilt-new +++ b/guilt-new @@ -64,7 +64,7 @@ fi if ! valid_patchname $patch; then disp Patchname is invalid. 2 - die it cannot begin with '/', './' or '../', or contain /./, /../, or whitespace + die It must follow the rules in git-check-ref-format(1). fi # create any directories as needed diff --git a/regression/t-025.out b/regression/t-025.out index 7811ab1..01bc406 100644 --- a/regression/t-025.out +++ b/regression/t-025.out @@ -141,7 +141,7 @@ f da39a3ee5e6b4b0d3255bfef95601890afd80709 .git/patches/master/prepend r acdeef96ee30eb34bbbf65d11de5cf7da4b5fee8 .git/refs/patches/master/prepend % guilt new white space Patchname is invalid. -it cannot begin with '/', './' or '../', or contain /./, /../, or whitespace +It must follow the rules in git-check-ref-format(1). % list_files d .git/patches d .git/patches/master @@ -211,7 +211,7 @@ f da39a3ee5e6b4b0d3255bfef95601890afd80709 .git/patches/master/prepend r acdeef96ee30eb34bbbf65d11de5cf7da4b5fee8 .git/refs/patches/master/prepend % guilt new /abc Patchname is invalid. -it cannot begin with '/', './' or '../', or contain /./, /../, or whitespace +It must follow the rules in git-check-ref-format(1). % list_files d .git/patches d .git/patches/master @@ -235,7 +235,7 @@ f da39a3ee5e6b4b0d3255bfef95601890afd80709 .git/patches/master/prepend r acdeef96ee30eb34bbbf65d11de5cf7da4b5fee8 .git/refs/patches/master/prepend % guilt new ./blah Patchname is invalid. -it cannot begin with '/', './' or '../', or contain /./, /../, or whitespace +It must follow the rules in git-check-ref-format(1). % list_files d .git/patches d .git/patches/master @@ -259,7 +259,7 @@ f da39a3ee5e6b4b0d3255bfef95601890afd80709 .git/patches/master/prepend r acdeef96ee30eb34bbbf65d11de5cf7da4b5fee8 .git/refs/patches/master/prepend % guilt new ../blah Patchname is invalid. -it cannot begin with '/', './' or '../', or contain /./, /../, or whitespace +It must follow the rules in git-check-ref-format(1). % list_files d .git/patches d .git/patches/master @@ -283,7 +283,7 @@ f da39a3ee5e6b4b0d3255bfef95601890afd80709 .git/patches/master/prepend r acdeef96ee30eb34bbbf65d11de5cf7da4b5fee8 .git/refs/patches/master
[GUILT v3 12/31] guilt header: more robust header selection.
If you run something like guilt header '.*' the command would crash, because the grep comand that tries to ensure that the patch exist would detect a match, but the later code expected the match to be exact. Fixed by comparing exact strings. And as a creeping feature guilt header will now try to use the supplied patch name as an unachored regexp if no exact match was found. If the regexp yields a unique match, it is used; if more than one patch matches, the names of all patches are listed and the command fails. (Exercise left to the reader: generalized this so that guilt push also accepts a unique regular expression.) Signed-off-by: Per Cederqvist ced...@opera.com --- guilt-header | 29 ++--- 1 file changed, 26 insertions(+), 3 deletions(-) diff --git a/guilt-header b/guilt-header index 41e00cc..c3d24f9 100755 --- a/guilt-header +++ b/guilt-header @@ -45,10 +45,33 @@ esac [ -z $patch ] die No patches applied. # check that patch exists in the series -ret=`get_full_series | grep -e ^$patch\$ | wc -l` -if [ $ret -eq 0 ]; then - die Patch $patch is not in the series +TMP_FULL_SERIES=`get_tmp_file series` +get_full_series $TMP_FULL_SERIES +found_patch= +while read x; do + if [ $x = $patch ]; then + found_patch=$patch + break + fi +done $TMP_FULL_SERIES +if [ -z $found_patch ]; then + TMP_MATCHES=`get_tmp_file series` + grep $patch $TMP_FULL_SERIES $TMP_MATCHES + nr=`wc -l $TMP_MATCHES` + if [ $nr -gt 1 ]; then + echo $patch does not uniquely identify a patch. Did you mean any of these? 2 + sed 's/^/ /' $TMP_MATCHES 2 + rm -f $TMP_MATCHES $TMP_FULL_SERIES + exit 1 + elif [ $nr -eq 0 ]; then + rm -f $TMP_MATCHES $TMP_FULL_SERIES + die Patch $patch is not in the series + fi + found_patch=`cat $TMP_MATCHES` + rm -f $TMP_MATCHES fi +rm -f $TMP_FULL_SERIES +patch=$found_patch # FIXME: warn if we're editing an applied patch -- 1.8.3.1 -- To unsubscribe from this list: send the line unsubscribe git in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[GUILT v3 15/31] Produce legal patch names in guilt-import-commit.
Try harder to create patch names that adhere to the rules in git-check-ref-format(1) when deriving a patch name from the commit message. Verify that the derived name using git check-ref-format, and as a final fallback simply use the patch name x (to ensure that the code is future-proof in case new rules are added in the future). Always append a .patch suffix to the patch name. Added test cases. Signed-off-by: Per Cederqvist ced...@opera.com Signed-off-by: Josef 'Jeff' Sipek jef...@josefsipek.net --- guilt-import-commit | 20 +- regression/t-034.out | 567 +++ regression/t-034.sh | 71 +++ 3 files changed, 656 insertions(+), 2 deletions(-) create mode 100644 regression/t-034.out create mode 100755 regression/t-034.sh diff --git a/guilt-import-commit b/guilt-import-commit index f14647c..6260c56 100755 --- a/guilt-import-commit +++ b/guilt-import-commit @@ -28,19 +28,35 @@ disp Current head: `git rev-parse \`git_branch\`` 2 for rev in `git rev-list $rhash`; do s=`git log --pretty=oneline -1 $rev | cut -c 42-` + # Try to convert the first line of the commit message to a + # valid patch name. fname=`echo $s | sed -e s//and/g -e s/[ :]/_/g -e s,[/\\],-,g \ -e s/['\\[{}]//g -e 's/]//g' -e 's/\*/-/g' \ - -e 's/\?/-/g' | tr A-Z a-z` + -e 's/\?/-/g' -e 's/\.\.\.*/./g' -e 's/^\.//' \ + -e 's/\.patch$//' -e 's/\.$//' | tr A-Z a-z` + + if ! valid_patchname $fname; then + # Try harder to make it a legal commit name by + # removing all but a few safe characters. + fname=`echo $fname|tr -d -c _a-zA-Z0-9---/\\n` + fi + if ! valid_patchname $fname; then + # If we failed to derive a legal patch name, use the + # name x. (If this happens, we likely have to + # append a suffix to make the name unique.) + fname=x + fi disp Converting `echo $rev | cut -c 1-8` as $fname mangle_prefix=1 fname_base=$fname - while [ -f $GUILT_DIR/$branch/$fname ]; do + while [ -f $GUILT_DIR/$branch/$fname.patch ]; do fname=$fname_base-$mangle_prefix mangle_prefix=`expr $mangle_prefix + 1` disp Patch under that name exists...trying '$fname' done + fname=$fname.patch ( do_make_header $rev diff --git a/regression/t-034.out b/regression/t-034.out new file mode 100644 index 000..7bc9459 --- /dev/null +++ b/regression/t-034.out @@ -0,0 +1,567 @@ +% setup_git_repo +% git tag base +% create_commit a The sequence /. is forbidden. +[master eebb76e] The sequence /. is forbidden. + Author: Author Name author@email + 1 file changed, 1 insertion(+) + create mode 100644 a +% create_commit a The sequence .lock/ is forbidden. +[master 45e81b5] The sequence .lock/ is forbidden. + Author: Author Name author@email + 1 file changed, 1 insertion(+) +% create_commit a A/component/may/not/end/in/foo.lock +[master bbf3f59] A/component/may/not/end/in/foo.lock + Author: Author Name author@email + 1 file changed, 1 insertion(+) +% create_commit a Two consecutive dots (..) is forbidden. +[master 1535e67] Two consecutive dots (..) is forbidden. + Author: Author Name author@email + 1 file changed, 1 insertion(+) +% create_commit a Check/multiple/../dots/./foo..patch +[master 48eb60c] Check/multiple/../dots/./foo..patch + Author: Author Name author@email + 1 file changed, 1 insertion(+) +% create_commit a Space is forbidden. +[master 10dea83] Space is forbidden. + Author: Author Name author@email + 1 file changed, 1 insertion(+) +% create_commit a Tilde~is~forbidden. +[master 70a83b7] Tilde~is~forbidden. + Author: Author Name author@email + 1 file changed, 1 insertion(+) +% create_commit a Caret^is^forbidden. +[master ee6ef2c] Caret^is^forbidden. + Author: Author Name author@email + 1 file changed, 1 insertion(+) +% create_commit a Colon:is:forbidden. +[master c077fe2] Colon:is:forbidden. + Author: Author Name author@email + 1 file changed, 1 insertion(+) +% create_commit a Delisforbidden. +[master 589ee30] Delisforbidden. + Author: Author Name author@email + 1 file changed, 1 insertion(+) +% git branch some-branch +% git tag some-tag +% create_commit a Ctrlisforbidden. +[master e63cdde] Ctrlisforbidden. + Author: Author Name author@email + 1 file changed, 1 insertion(+) +% create_commit a CR is also forbidden. +[master 21ad093] CR is also forbidden. + Author: Author Name author@email + 1 file changed, 1 insertion(+) +% create_commit a Question-mark?is?forbidden. +[master be2fa9b] Question-mark?is?forbidden. + Author: Author Name author@email + 1 file changed, 1 insertion(+) +% create_commit a Asterisk*is*forbidden. +[master af7b50f] Asterisk*is*forbidden. + Author: Author Name author@email + 1 file changed, 1 insertion
[GUILT v3 16/31] Fix backslash handling when creating names of imported patches.
The 'echo $s' construct sometimes processes escape sequences. (This happens, for instance, under Ubuntu 14.04 when /bin/sh is actually dash.) We don't want that to happen when we are importing commits, so use 'printf %s $s' instead. (The -E option of bash that explicitly disables backslash expansion is not portable; it is not supported by dash.) Signed-off-by: Per Cederqvist ced...@opera.com Signed-off-by: Josef 'Jeff' Sipek jef...@josefsipek.net --- guilt-import-commit | 2 +- regression/t-034.out | 14 +++--- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/guilt-import-commit b/guilt-import-commit index 6260c56..45f2404 100755 --- a/guilt-import-commit +++ b/guilt-import-commit @@ -30,7 +30,7 @@ for rev in `git rev-list $rhash`; do # Try to convert the first line of the commit message to a # valid patch name. - fname=`echo $s | sed -e s//and/g -e s/[ :]/_/g -e s,[/\\],-,g \ + fname=`printf %s $s | sed -e s//and/g -e s/[ :]/_/g -e s,[/\\],-,g \ -e s/['\\[{}]//g -e 's/]//g' -e 's/\*/-/g' \ -e 's/\?/-/g' -e 's/\.\.\.*/./g' -e 's/^\.//' \ -e 's/\.patch$//' -e 's/\.$//' | tr A-Z a-z` diff --git a/regression/t-034.out b/regression/t-034.out index 7bc9459..bda4399 100644 --- a/regression/t-034.out +++ b/regression/t-034.out @@ -236,7 +236,7 @@ Date: Mon Jan 1 00:00:00 2007 + About to begin conversion... Current head: 2a8b1889aa5066193bac978e6bf5073ffcfa6541 Converting 2a8b1889 as can-have-embedded-single-slashes -Converting 0a46f8fa as backslash-isorbidden +Converting 0a46f8fa as backslash-is-forbidden Converting aedb74fd as x Converting 30187ed0 as cannot@have@the@sequence@at-brace Converting 106e8e5a as cannot_end_in_ @@ -300,7 +300,7 @@ Applying patch..cannot@have@the@sequence@at-brace.patch Patch applied. Applying patch..x.patch Patch applied. -Applying patch..backslash-isorbidden.patch +Applying patch..backslash-is-forbidden.patch Patch applied. Applying patch..can-have-embedded-single-slashes.patch Patch applied. @@ -311,7 +311,7 @@ Date: Mon Jan 1 00:00:00 2007 + Can/have/embedded/single/slashes -commit 7c3ffa4f940c862e9f11f5d4a5ae421f7a8d3141 (refs/patches/master/backslash-isorbidden.patch) +commit 7c3ffa4f940c862e9f11f5d4a5ae421f7a8d3141 (refs/patches/master/backslash-is-forbidden.patch) Author: Author Name author@email Date: Mon Jan 1 00:00:00 2007 + @@ -518,8 +518,6 @@ d .git/patches/master d .git/refs/patches d .git/refs/patches/master f 06beca7069b9e576bd431f65d13862ed5d3e2a0f .git/patches/master/ctrlisforbidden.patch -f 08267ec6783ea9d1adae55b275198f7594764ed0 .git/patches/master/series -f 08267ec6783ea9d1adae55b275198f7594764ed0 .git/patches/master/status f 09b7e9be44ae5ec3a4bb30f5ee9d4ebc2c042f64 .git/patches/master/two_consecutive_dots_(.)_is_forbidden.patch f 0b971c9a17aeca2319c93d700ffd98acc2a93451 .git/patches/master/question-mark-is-forbidden.patch f 2b8392f63d61efc12add554555adae30883993cc .git/patches/master/cannot-end-in-slash-.patch @@ -529,7 +527,7 @@ f 34e07c584032df137f19bdb66d93f316f00a5ac8 .git/patches/master/tildeisforbidden f 49bab499826b63deb2bd704629d60c7268c57aee .git/patches/master/the_sequence_-._is_forbidden.patch f 5bcddb8ccb6e6e5e8a61e9e56cb2e0f70cbab2f5 .git/patches/master/cannot@have@the@sequence@at-brace.patch f 637b982fe14a240de181ae63226b27e0c406b3dc .git/patches/master/asterisk-is-forbidden.patch -f 698f8a7d41a64e3b6be1a3eba86574078b22a5f3 .git/patches/master/backslash-isorbidden.patch +f 698f8a7d41a64e3b6be1a3eba86574078b22a5f3 .git/patches/master/backslash-is-forbidden.patch f 7b103c3c7ae298cd2334f6f49da48bae1424f77b .git/patches/master/crisalsoforbidden.patch f 9b810b8c63779c51d2e7f61ab59cd49835041563 .git/patches/master/x.patch f a22958d9ae9976fd7b2b5a9d0bcd44bf7ad9b08a .git/patches/master/caretisforbidden.patch @@ -537,6 +535,8 @@ f ab325bf5a432937fc6f231d3e8a773a62d53952b .git/patches/master/multiple-slashes f cb9cffbd4465bddee266c20ccebd14eb687eaa89 .git/patches/master/delisforbidden.patch f d0885a1a1fdee0fd1e4fedce3f7acd3100540bc4 .git/patches/master/openbracketisforbidden.patch f d2903523fb66a346596eabbdd1bda4e52b266440 .git/patches/master/check-multiple-.-dots-.-foo.patch +f da90de1c84138194524994e0bc3bc4ca8189c999 .git/patches/master/series +f da90de1c84138194524994e0bc3bc4ca8189c999 .git/patches/master/status f dfc11f76394059909671af036598c5fbe33001ba .git/patches/master/space_is_forbidden.patch f e47474c52d6c893f36d0457f885a6dd1267742bb .git/patches/master/colon_is_forbidden.patch f e7a5f8912592d9891e6159f5827c8b4f372cc406 .git/patches/master/the_sequence_.lock-_is_forbidden.patch @@ -548,7 +548,7 @@ r 1626a11d979a1e9e775c766484172212277153df .git/refs/patches/master/asterisk-is r 3a0d5ccef0359004fcaa9cee98fbd6a2c4432e74 .git/refs/patches/master/tildeisforbidden.patch r 434e07cacdd8e7eb4723e67cb2d100b3a4121a3a
[GUILT v3 18/31] guilt-graph: Handle commas in branch names.
This fix relies on the fact that git branch names can not contain :. Signed-off-by: Per Cederqvist ced...@opera.com Signed-off-by: Josef 'Jeff' Sipek jef...@josefsipek.net --- guilt-graph | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/guilt-graph b/guilt-graph index 56d0e77..924a63e 100755 --- a/guilt-graph +++ b/guilt-graph @@ -51,7 +51,7 @@ safebranch=`echo $branch|sed 's%/%/%g'` while [ $current != $base ]; do pname=`git show-ref | sed -n -e /^$current refs\/patches\/$safebranch/ { - s,^$current refs/patches/$branch/,, + s:^$current refs/patches/$branch/:: p q }` -- 1.8.3.1 -- To unsubscribe from this list: send the line unsubscribe git in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[GUILT v3 17/31] guilt graph no longer loops when no patches are applied.
Give an error message if no patches are applied. Added a test case that never terminates unless this fix is applied. Signed-off-by: Per Cederqvist ced...@opera.com Signed-off-by: Josef 'Jeff' Sipek jef...@josefsipek.net --- guilt-graph | 9 +++-- regression/t-033.out | 3 +++ regression/t-033.sh | 13 + 3 files changed, 23 insertions(+), 2 deletions(-) create mode 100644 regression/t-033.out create mode 100755 regression/t-033.sh diff --git a/guilt-graph b/guilt-graph index b3469dc..56d0e77 100755 --- a/guilt-graph +++ b/guilt-graph @@ -17,8 +17,13 @@ fi patchname=$1 -bottom=`git rev-parse refs/patches/$branch/$(head_n 1 $applied)` -base=`git rev-parse $bottom^` +bottompatch=$(head_n 1 $applied) +if [ -z $bottompatch ]; then + echo No patch applied. 2 + exit 1 +fi + +base=`git rev-parse refs/patches/${branch}/${bottompatch}^` if [ -z $patchname ]; then top=`git rev-parse HEAD` diff --git a/regression/t-033.out b/regression/t-033.out new file mode 100644 index 000..76613f9 --- /dev/null +++ b/regression/t-033.out @@ -0,0 +1,3 @@ +% setup_repo +% guilt graph +No patch applied. diff --git a/regression/t-033.sh b/regression/t-033.sh new file mode 100755 index 000..a3a8981 --- /dev/null +++ b/regression/t-033.sh @@ -0,0 +1,13 @@ +#!/bin/bash +# +# Test the graph code +# + +source $REG_DIR/scaffold + +cmd setup_repo + +# Check that guilt graph gives a proper No patch applied error +# message when no patches are applied. (An older version of guilt +# used to enter an endless loop in this situation.) +shouldfail guilt graph -- 1.8.3.1 -- To unsubscribe from this list: send the line unsubscribe git in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[GUILT v3 19/31] Check that guilt graph works when working on a branch with a comma.
git branch names can contain commas. Check that guilt graph works even in that case. Signed-off-by: Per Cederqvist ced...@opera.com Signed-off-by: Josef 'Jeff' Sipek jef...@josefsipek.net --- regression/t-033.out | 65 regression/t-033.sh | 39 +++ 2 files changed, 104 insertions(+) diff --git a/regression/t-033.out b/regression/t-033.out index 76613f9..3d1c61f 100644 --- a/regression/t-033.out +++ b/regression/t-033.out @@ -1,3 +1,68 @@ % setup_repo % guilt graph No patch applied. +%% Testing branch a,graph +% git checkout -b a,graph master +Switched to a new branch 'a,graph' +% guilt init +% guilt new a.patch +% guilt pop +All patches popped. +% guilt push +Applying patch..a.patch +Patch applied. +% guilt graph +digraph G { +# checking rev 95275d7c05c6a6176d3941374115b91272877f6c + 95275d7c05c6a6176d3941374115b91272877f6c [label=a.patch] +} +% git add file.txt +% guilt refresh +Patch a.patch refreshed +% guilt pop +All patches popped. +% guilt push +Applying patch..a.patch +Patch applied. +% guilt graph +digraph G { +# checking rev ff2775f8d1dc753f635830adcc3a067e0b681e2d + ff2775f8d1dc753f635830adcc3a067e0b681e2d [label=a.patch] +} +%% Adding an unrelated file in a new patch. No deps. +% guilt new b.patch +% git add file2.txt +% guilt refresh +Patch b.patch refreshed +% guilt pop +Now at a.patch. +% guilt push +Applying patch..b.patch +Patch applied. +% guilt graph +digraph G { +# checking rev c7014443c33d2b0237293687ceb9cbd38313df65 + c7014443c33d2b0237293687ceb9cbd38313df65 [label=b.patch] +# checking rev ff2775f8d1dc753f635830adcc3a067e0b681e2d + ff2775f8d1dc753f635830adcc3a067e0b681e2d [label=a.patch] +} +%% Changing a file already changed in the first patch adds a dependency. +% guilt new c.patch +% git add file.txt +% guilt refresh +Patch c.patch refreshed +% guilt pop +Now at b.patch. +% guilt push +Applying patch..c.patch +Patch applied. +% guilt graph +digraph G { +# checking rev 891bc14b5603474c9743fd04f3da888644413dc5 + 891bc14b5603474c9743fd04f3da888644413dc5 [label=c.patch] +# checking rev c7014443c33d2b0237293687ceb9cbd38313df65 + c7014443c33d2b0237293687ceb9cbd38313df65 [label=b.patch] +# checking rev ff2775f8d1dc753f635830adcc3a067e0b681e2d + ff2775f8d1dc753f635830adcc3a067e0b681e2d [label=a.patch] + 891bc14b5603474c9743fd04f3da888644413dc5 - ff2775f8d1dc753f635830adcc3a067e0b681e2d; // ? +} diff --git a/regression/t-033.sh b/regression/t-033.sh index a3a8981..fac081e 100755 --- a/regression/t-033.sh +++ b/regression/t-033.sh @@ -3,6 +3,13 @@ # Test the graph code # +function fixup_time_info +{ + cmd guilt pop + touch -a -m -t $TOUCH_DATE .git/patches/a,graph/$1 + cmd guilt push +} + source $REG_DIR/scaffold cmd setup_repo @@ -11,3 +18,35 @@ cmd setup_repo # message when no patches are applied. (An older version of guilt # used to enter an endless loop in this situation.) shouldfail guilt graph + +echo %% Testing branch a,graph +cmd git checkout -b a,graph master + +cmd guilt init + +cmd guilt new a.patch + +fixup_time_info a.patch +cmd guilt graph + +cmd echo a file.txt +cmd git add file.txt +cmd guilt refresh +fixup_time_info a.patch +cmd guilt graph + +echo %% Adding an unrelated file in a new patch. No deps. +cmd guilt new b.patch +cmd echo b file2.txt +cmd git add file2.txt +cmd guilt refresh +fixup_time_info b.patch +cmd guilt graph + +echo %% Changing a file already changed in the first patch adds a dependency. +cmd guilt new c.patch +cmd echo c file.txt +cmd git add file.txt +cmd guilt refresh +fixup_time_info c.patch +cmd guilt graph -- 1.8.3.1 -- To unsubscribe from this list: send the line unsubscribe git in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[GUILT v3 21/31] The log.decorate setting should not influence import-commit.
Use --no-decorate in the call to git log that tries to read the commit message to produce patch names. Otherwise, if the user has set log.decorate to short or full, the patch name will be less useful. Modify the t-034.sh test case to demonstrate that this is needed. Signed-off-by: Per Cederqvist ced...@opera.com Signed-off-by: Josef 'Jeff' Sipek jef...@josefsipek.net --- guilt-import-commit | 2 +- regression/t-034.out | 2 ++ regression/t-034.sh | 2 ++ 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/guilt-import-commit b/guilt-import-commit index 45f2404..1da7c8e 100755 --- a/guilt-import-commit +++ b/guilt-import-commit @@ -26,7 +26,7 @@ disp About to begin conversion... 2 disp Current head: `git rev-parse \`git_branch\`` 2 for rev in `git rev-list $rhash`; do - s=`git log --pretty=oneline -1 $rev | cut -c 42-` + s=`git log --no-decorate --pretty=oneline -1 $rev | cut -c 42-` # Try to convert the first line of the commit message to a # valid patch name. diff --git a/regression/t-034.out b/regression/t-034.out index bda4399..5d81bd4 100644 --- a/regression/t-034.out +++ b/regression/t-034.out @@ -232,6 +232,7 @@ Date: Mon Jan 1 00:00:00 2007 + Signed-off-by: Commiter Name commiter@email % guilt init +% git config log.decorate short % guilt import-commit base..HEAD About to begin conversion... Current head: 2a8b1889aa5066193bac978e6bf5073ffcfa6541 @@ -259,6 +260,7 @@ Converting 45e81b51 as the_sequence_.lock-_is_forbidden Converting eebb76e9 as the_sequence_-._is_forbidden Done. Current head: d4850419ccc1146c7169f500725ce504b9774ed0 +% git config log.decorate no % guilt push -a Applying patch..the_sequence_-._is_forbidden.patch Patch applied. diff --git a/regression/t-034.sh b/regression/t-034.sh index f41f958..648d009 100755 --- a/regression/t-034.sh +++ b/regression/t-034.sh @@ -57,7 +57,9 @@ cmd git log # Import all the commits to guilt. cmd guilt init +cmd git config log.decorate short cmd guilt import-commit base..HEAD +cmd git config log.decorate no for patch in .git/patches/master/*.patch; do touch -a -m -t $TOUCH_DATE $patch -- 1.8.3.1 -- To unsubscribe from this list: send the line unsubscribe git in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[GUILT v3 20/31] guilt graph: Handle patch names containing quotes.
Quote quotes with a backslash in the guilt graph output. Otherwise, the dot file could contain syntax errors. Added a test case. Signed-off-by: Per Cederqvist ced...@opera.com Signed-off-by: Josef 'Jeff' Sipek jef...@josefsipek.net --- guilt-graph | 2 ++ regression/t-033.out | 22 ++ regression/t-033.sh | 9 + 3 files changed, 33 insertions(+) diff --git a/guilt-graph b/guilt-graph index 924a63e..0857e0d 100755 --- a/guilt-graph +++ b/guilt-graph @@ -57,6 +57,8 @@ while [ $current != $base ]; do }` [ -z $pname ] pname=? + pname=`printf \%s\ \$pname\ | sed 's/\/\/g'` + disp # checking rev $current disp \$current\ [label=\$pname\] diff --git a/regression/t-033.out b/regression/t-033.out index 3d1c61f..c120d4f 100644 --- a/regression/t-033.out +++ b/regression/t-033.out @@ -66,3 +66,25 @@ digraph G { ff2775f8d1dc753f635830adcc3a067e0b681e2d [label=a.patch] 891bc14b5603474c9743fd04f3da888644413dc5 - ff2775f8d1dc753f635830adcc3a067e0b681e2d; // ? } +% guilt new a-betterquicker'-patch.patch +% git add file.txt +% guilt refresh +Patch a-betterquicker'-patch.patch refreshed +% guilt pop +Now at c.patch. +% guilt push +Applying patch..a-betterquicker'-patch.patch +Patch applied. +% guilt graph +digraph G { +# checking rev bc7df666a646739eaf559af23cab72f2bfd01f0e + bc7df666a646739eaf559af23cab72f2bfd01f0e [label=a-\betterquicker'-patch.patch] +# checking rev 891bc14b5603474c9743fd04f3da888644413dc5 + 891bc14b5603474c9743fd04f3da888644413dc5 [label=c.patch] + bc7df666a646739eaf559af23cab72f2bfd01f0e - 891bc14b5603474c9743fd04f3da888644413dc5; // ? +# checking rev c7014443c33d2b0237293687ceb9cbd38313df65 + c7014443c33d2b0237293687ceb9cbd38313df65 [label=b.patch] +# checking rev ff2775f8d1dc753f635830adcc3a067e0b681e2d + ff2775f8d1dc753f635830adcc3a067e0b681e2d [label=a.patch] + 891bc14b5603474c9743fd04f3da888644413dc5 - ff2775f8d1dc753f635830adcc3a067e0b681e2d; // ? +} diff --git a/regression/t-033.sh b/regression/t-033.sh index fac081e..9fe1827 100755 --- a/regression/t-033.sh +++ b/regression/t-033.sh @@ -50,3 +50,12 @@ cmd git add file.txt cmd guilt refresh fixup_time_info c.patch cmd guilt graph + +# A patch name that contains funky characters, including unbalanced +# quotes. +cmd guilt new a-\betterquicker'-patch.patch +cmd echo d file.txt +cmd git add file.txt +cmd guilt refresh +fixup_time_info a-\betterquicker'-patch.patch +cmd guilt graph -- 1.8.3.1 -- To unsubscribe from this list: send the line unsubscribe git in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[GUILT v3 24/31] disp no longer processes backslashes.
Only one invocation of disp or _disp actually needed backslash processing. In quite a few instances, it was wrong to do backslash processing, as the message contained data derived from the user. Created the new function disp_e that should be used when backslash processing is required, and changed disp and _disp to use printf code %s instead of %b. Signed-off-by: Per Cederqvist ced...@opera.com Signed-off-by: Josef 'Jeff' Sipek jef...@josefsipek.net --- guilt | 17 + 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/guilt b/guilt index 23cc2da..9947acc 100755 --- a/guilt +++ b/guilt @@ -36,15 +36,24 @@ usage() exit 1 } -# echo -n is a bashism, use printf instead +# Print arguments, but no trailing newline. +# (echo -n is a bashism, use printf instead) _disp() { - printf %b $* + printf %s $* } -# echo -e is a bashism, use printf instead +# Print arguments. +# (echo -E is a bashism, use printf instead) disp() { + printf %s\n $* +} + +# Print arguments, processing backslash sequences. +# (echo -e is a bashism, use printf instead) +disp_e() +{ printf %b\n $* } @@ -117,7 +126,7 @@ else disp disp Example: - disp \tguilt push + disp_e \tguilt push # now, let's exit exit 1 -- 1.8.3.1 -- To unsubscribe from this list: send the line unsubscribe git in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[GUILT v3 23/31] The log.decorate setting should not influence guilt rebase.
Signed-off-by: Per Cederqvist ced...@opera.com Signed-off-by: Josef 'Jeff' Sipek jef...@josefsipek.net --- guilt-rebase | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/guilt-rebase b/guilt-rebase index fd28e48..a1714a0 100755 --- a/guilt-rebase +++ b/guilt-rebase @@ -66,7 +66,7 @@ pop_all_patches git merge --no-commit $upstream /dev/null 2 /dev/null disp -log=`git log -1 --pretty=oneline` +log=`git log -1 --no-decorate --pretty=oneline` disp HEAD is now at `echo $log | cut -c 1-7`... `echo $log | cut -c 41-` # -- 1.8.3.1 -- To unsubscribe from this list: send the line unsubscribe git in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[GUILT v3 22/31] The log.decorate setting should not influence patchbomb.
Signed-off-by: Per Cederqvist ced...@opera.com Signed-off-by: Josef 'Jeff' Sipek jef...@josefsipek.net --- guilt-patchbomb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/guilt-patchbomb b/guilt-patchbomb index 1231418..164b10c 100755 --- a/guilt-patchbomb +++ b/guilt-patchbomb @@ -47,7 +47,7 @@ if [ $? -ne 0 ]; then fi # display the list of commits to be sent as patches -git log --pretty=oneline $r | cut -c 1-8,41- | $pager +git log --no-decorate --pretty=oneline $r | cut -c 1-8,41- | $pager _disp Are these what you want to send? [Y/n] read n -- 1.8.3.1 -- To unsubscribe from this list: send the line unsubscribe git in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[GUILT v3 25/31] guilt push now fails when there are no more patches to push.
This makes it easier to script operations on the entire queue, for example run the test suite on each patch in the queue: guilt pop -a;while guilt push; do make test||break; done This brings guilt push in line with the push operation in Mercurial Queues (hg qpush), which fails when there are no patches to apply. Updated the test suite. guilt push -a still does not fail. (It successfully manages to ensure that all patches are pushed, even if it did not have to do anything to make it so.) Signed-off-by: Per Cederqvist ced...@opera.com Signed-off-by: Josef 'Jeff' Sipek jef...@josefsipek.net --- guilt-push | 19 ++- regression/t-020.out | 89 regression/t-020.sh | 13 +++- 3 files changed, 113 insertions(+), 8 deletions(-) diff --git a/guilt-push b/guilt-push index 67687e7..39c125e 100755 --- a/guilt-push +++ b/guilt-push @@ -56,6 +56,12 @@ fi patch=$1 [ ! -z $all ] patch=-a +# Treat guilt push as guilt push -n 1. +if [ -z $patch ]; then + patch=1 + num=t +fi + if [ $patch = -a ]; then # we are supposed to push all patches, get the last one out of # series @@ -65,7 +71,7 @@ if [ $patch = -a ]; then die There are no patches to push. fi elif [ ! -z $num ]; then - # we are supposed to pop a set number of patches + # we are supposed to push a set number of patches [ $patch -lt 0 ] die Invalid number of patches to push. @@ -78,11 +84,6 @@ elif [ ! -z $num ]; then # clamp to minimum [ $tidx -lt $eidx ] eidx=$tidx -elif [ -z $patch ]; then - # we are supposed to push only the next patch onto the stack - - eidx=`wc -l $applied` - eidx=`expr $eidx + 1` else # we're supposed to push only up to a patch, make sure the patch is # in the series @@ -109,7 +110,11 @@ if [ $sidx -gt $eidx ]; then else disp File series fully applied, ends at patch `get_series | tail -n 1` fi - exit 0 + if [ -n $all ]; then + exit 0 + else + exit 1 + fi fi get_series | sed -n -e ${sidx},${eidx}p | while read p diff --git a/regression/t-020.out b/regression/t-020.out index 42433dc..bcb8797 100644 --- a/regression/t-020.out +++ b/regression/t-020.out @@ -270,6 +270,95 @@ index 000..8baef1b +++ b/def @@ -0,0 +1 @@ +abc +% guilt push +File series fully applied, ends at patch mode +% guilt push -a +File series fully applied, ends at patch mode +% list_files +d .git/patches +d .git/patches/master +d .git/refs/patches +d .git/refs/patches/master +f 22930c6d1f1938f298a4fca51c57e4b47171db21 .git/patches/master/mode +f 413390f3906f16f30b054a4fb86c1e014b964504 .git/patches/master/remove +f 71596bf71b72c2717e1aee378aabefbfa19ab7c8 .git/patches/master/status +f 9c18cc7abe6b87f18503714a80a677b4094eb457 .git/patches/master/add +f bacb4aad8a55fe4e7aa58a9ae169990bb764069f .git/patches/master/series +f bc9ab2e0f5db99d483961e956e814d963f0309f8 .git/patches/master/modify +r 33633e7a1aa31972f125878baf7807be57b1672d .git/refs/patches/master/modify +r 37d588cc39848368810e88332bd03b083f2ce3ac .git/refs/patches/master/add +r ccd56089d1b5305a9d35617cb7f6f4b06ffa68ba .git/refs/patches/master/mode +r ffb7faa126a6d91bcdd44a494f76b96dd860b8b9 .git/refs/patches/master/remove +% git log -p +commit ccd56089d1b5305a9d35617cb7f6f4b06ffa68ba +Author: Author Name author@email +Date: Mon Jan 1 00:00:00 2007 + + +patch mode + +diff --git a/def b/def +old mode 100644 +new mode 100755 + +commit ffb7faa126a6d91bcdd44a494f76b96dd860b8b9 +Author: Author Name author@email +Date: Mon Jan 1 00:00:00 2007 + + +patch remove + +diff --git a/abd b/abd +deleted file mode 100644 +index fd3896d..000 +--- a/abd /dev/null +@@ -1 +0,0 @@ +-öuؽáZâñeÏÈE£WÀV¼/U?Ú|¢@6¤8'H¸1G_ͧ*·ðRÒ¤ ªÂ~· +\ No newline at end of file + +commit 37d588cc39848368810e88332bd03b083f2ce3ac +Author: Author Name author@email +Date: Mon Jan 1 00:00:00 2007 + + +patch add + +diff --git a/abd b/abd +new file mode 100644 +index 000..fd3896d +--- /dev/null b/abd +@@ -0,0 +1 @@ ++öuؽáZâñeÏÈE£WÀV¼/U?Ú|¢@6¤8'H¸1G_ͧ*·ðRÒ¤ ªÂ~· +\ No newline at end of file + +commit 33633e7a1aa31972f125878baf7807be57b1672d +Author: Author Name author@email +Date: Mon Jan 1 00:00:00 2007 + + +patch modify + +diff --git a/def b/def +index 8baef1b..7d69c2f 100644 +--- a/def b/def +@@ -1 +1,2 @@ + abc ++asjhfksad + +commit d4850419ccc1146c7169f500725ce504b9774ed0 +Author: Author Name author@email +Date: Mon Jan 1 00:00:00 2007 + + +initial + +Signed-off-by: Commiter Name commiter@email + +diff --git a/def b/def +new file mode 100644 +index 000..8baef1b +--- /dev/null b/def +@@ -0,0 +1 @@ ++abc % guilt pop --all All patches popped. % guilt push diff --git a/regression/t-020.sh b/regression/t-020.sh index
[GUILT v3 27/31] Minor testsuite fix.
Fix remove_topic() in t-061.sh so that it doesn't print a git hash. Signed-off-by: Per Cederqvist ced...@opera.com Signed-off-by: Josef 'Jeff' Sipek jef...@josefsipek.net --- regression/t-061.out | 1 - regression/t-061.sh | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/regression/t-061.out b/regression/t-061.out index ef0f335..60ad56d 100644 --- a/regression/t-061.out +++ b/regression/t-061.out @@ -381,7 +381,6 @@ ccd56089d1b5305a9d35617cb7f6f4b06ffa68ba commit refs/patches/master/mode ffb7faa126a6d91bcdd44a494f76b96dd860b8b9 commit refs/patches/master/remove % guilt pop -a No patches applied. -ccd56089d1b5305a9d35617cb7f6f4b06ffa68ba % git checkout guilt/master Switched to branch guilt/master % guilt pop -a diff --git a/regression/t-061.sh b/regression/t-061.sh index 6192f1b..db26e12 100755 --- a/regression/t-061.sh +++ b/regression/t-061.sh @@ -15,7 +15,7 @@ old_style_branch() { remove_topic() { cmd guilt pop -a - if git rev-parse --verify --quiet guilt/master + if git rev-parse --verify --quiet guilt/master /dev/null then cmd git checkout guilt/master else -- 1.8.3.1 -- To unsubscribe from this list: send the line unsubscribe git in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[GUILT v3 28/31] Fix coding style errors in t-061.sh.
Signed-off-by: Per Cederqvist ced...@opera.com --- regression/t-061.sh | 6 ++ 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/regression/t-061.sh b/regression/t-061.sh index db26e12..bda50c7 100755 --- a/regression/t-061.sh +++ b/regression/t-061.sh @@ -15,8 +15,7 @@ old_style_branch() { remove_topic() { cmd guilt pop -a - if git rev-parse --verify --quiet guilt/master /dev/null - then + if git rev-parse --verify --quiet guilt/master /dev/null; then cmd git checkout guilt/master else cmd git checkout master @@ -46,8 +45,7 @@ cmd git for-each-ref cmd list_files -for i in `seq 5` -do +for i in `seq 5`; do if [ $i -ge 5 ]; then shouldfail guilt pop else -- 1.8.3.1 -- To unsubscribe from this list: send the line unsubscribe git in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[GUILT v3 26/31] guilt pop now fails when there are no more patches to pop.
This is analogous to how guilt push now fails when there are no more patches to push. Like push, the --all argument still succeeds even if there was no need to pop anything. Updated the test suite. Signed-off-by: Per Cederqvist ced...@opera.com Signed-off-by: Josef 'Jeff' Sipek jef...@josefsipek.net --- guilt-pop| 17 +++-- regression/t-021.out | 2 ++ regression/t-021.sh | 6 ++ regression/t-061.sh | 6 +- 4 files changed, 24 insertions(+), 7 deletions(-) diff --git a/guilt-pop b/guilt-pop index f0e647f..191313e 100755 --- a/guilt-pop +++ b/guilt-pop @@ -49,9 +49,19 @@ fi patch=$1 [ ! -z $all ] patch=-a +# Treat guilt pop as guilt pop -n 1. +if [ -z $patch ]; then + patch=1 + num=t +fi + if [ ! -s $applied ]; then disp No patches applied. - exit 0 + if [ $patch = -a ]; then + exit 0 + else + exit 1 + fi elif [ $patch = -a ]; then # we are supposed to pop all patches @@ -68,11 +78,6 @@ elif [ ! -z $num ]; then # catch underflow [ $eidx -lt 0 ] eidx=0 [ $eidx -eq $sidx ] die No patches requested to be removed. -elif [ -z $patch ]; then - # we are supposed to pop only the current patch on the stack - - sidx=`wc -l $applied` - eidx=`expr $sidx - 1` else # we're supposed to pop only up to a patch, make sure the patch is # in the series diff --git a/regression/t-021.out b/regression/t-021.out index 9b42d9c..58be12f 100644 --- a/regression/t-021.out +++ b/regression/t-021.out @@ -287,6 +287,8 @@ index 000..8baef1b +++ b/def @@ -0,0 +1 @@ +abc +% guilt pop +No patches applied. % guilt push --all Applying patch..modify Patch applied. diff --git a/regression/t-021.sh b/regression/t-021.sh index 614e870..e0d2dc1 100755 --- a/regression/t-021.sh +++ b/regression/t-021.sh @@ -23,6 +23,12 @@ guilt series | _tac | while read n ; do done # +# pop when there is nothing to pop +# + +shouldfail guilt pop + +# # push all # cmd guilt push --all diff --git a/regression/t-061.sh b/regression/t-061.sh index 1411baa..6192f1b 100755 --- a/regression/t-061.sh +++ b/regression/t-061.sh @@ -48,7 +48,11 @@ cmd list_files for i in `seq 5` do - cmd guilt pop + if [ $i -ge 5 ]; then + shouldfail guilt pop + else + cmd guilt pop + fi cmd git for-each-ref cmd guilt push cmd git for-each-ref -- 1.8.3.1 -- To unsubscribe from this list: send the line unsubscribe git in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[GUILT v3 29/31] Added guilt.reusebranch configuration option.
When the option is true, Guilt does not create a new Git branch when patches are applied. This way, you can switch between Guilt 0.35 and the current version of Guilt with no issues. By default, the option is false, so that all users will immediately get the added protection against pushing a branch upstream with a patch applied. While this might break guilt if a user is running both version 0.35 and the current version against the same local repository, it will not lead to data loss, and that situation is probably rare. Signed-off-by: Per Cederqvist ced...@opera.com --- guilt| 24 ++- regression/scaffold | 1 + regression/t-062.out | 420 +++ regression/t-062.sh | 130 4 files changed, 569 insertions(+), 6 deletions(-) create mode 100644 regression/t-062.out create mode 100755 regression/t-062.sh diff --git a/guilt b/guilt index 9947acc..ac7d046 100755 --- a/guilt +++ b/guilt @@ -853,6 +853,9 @@ guilt_push_diff_context=1 # default diffstat value: true or false DIFFSTAT_DEFAULT=false +# default guilt.reusebranch value: true or false +REUSE_BRANCH_DEFAULT=false + # Prefix for guilt branches. GUILT_PREFIX=guilt/ @@ -864,6 +867,10 @@ GUILT_PREFIX=guilt/ diffstat=`git config --bool guilt.diffstat` [ -z $diffstat ] diffstat=$DIFFSTAT_DEFAULT +# reuse Git branch? +reuse_branch=`git config --bool guilt.reusebranch` +[ -z $reuse_branch ] reuse_branch=$REUSE_BRANCH_DEFAULT + # # The following gets run every time this file is source'd # @@ -928,13 +935,18 @@ else die Unsupported operating system: $UNAME_S fi -if [ $branch = $raw_git_branch ] [ -n `get_top 2/dev/null` ] -then -# This is for compat with old repositories that still have a -# pushed patch without the new-style branch prefix. -old_style_prefix=true +if [ -n `get_top 2/dev/null` ]; then + # If there is at least one pushed patch, we set + # old_style_prefix according to how it was pushed. It is only + # possible to change the prefix style while no patches are + # applied. + if [ $branch = $raw_git_branch ]; then + old_style_prefix=true + else + old_style_prefix=false + fi else -old_style_prefix=false + old_style_prefix=$reuse_branch fi _main $@ diff --git a/regression/scaffold b/regression/scaffold index e4d7487..e4d2f35 100644 --- a/regression/scaffold +++ b/regression/scaffold @@ -93,6 +93,7 @@ function setup_git_repo git config log.date default git config log.decorate no git config guilt.diffstat false + git config guilt.reusebranch false } function setup_guilt_repo diff --git a/regression/t-062.out b/regression/t-062.out new file mode 100644 index 000..ad5c081 --- /dev/null +++ b/regression/t-062.out @@ -0,0 +1,420 @@ +% setup_repo +% git config guilt.reusebranch true +% guilt push -a +Applying patch..modify +Patch applied. +Applying patch..add +Patch applied. +Applying patch..remove +Patch applied. +Applying patch..mode +Patch applied. +% list_files +d .git/patches +d .git/patches/master +d .git/refs/patches +d .git/refs/patches/master +f 22930c6d1f1938f298a4fca51c57e4b47171db21 .git/patches/master/mode +f 413390f3906f16f30b054a4fb86c1e014b964504 .git/patches/master/remove +f 71596bf71b72c2717e1aee378aabefbfa19ab7c8 .git/patches/master/status +f 9c18cc7abe6b87f18503714a80a677b4094eb457 .git/patches/master/add +f bacb4aad8a55fe4e7aa58a9ae169990bb764069f .git/patches/master/series +f bc9ab2e0f5db99d483961e956e814d963f0309f8 .git/patches/master/modify +r 33633e7a1aa31972f125878baf7807be57b1672d .git/refs/patches/master/modify +r 37d588cc39848368810e88332bd03b083f2ce3ac .git/refs/patches/master/add +r ccd56089d1b5305a9d35617cb7f6f4b06ffa68ba .git/refs/patches/master/mode +r ffb7faa126a6d91bcdd44a494f76b96dd860b8b9 .git/refs/patches/master/remove +% git for-each-ref +ccd56089d1b5305a9d35617cb7f6f4b06ffa68ba commitrefs/heads/master +37d588cc39848368810e88332bd03b083f2ce3ac commitrefs/patches/master/add +ccd56089d1b5305a9d35617cb7f6f4b06ffa68ba commitrefs/patches/master/mode +33633e7a1aa31972f125878baf7807be57b1672d commit refs/patches/master/modify +ffb7faa126a6d91bcdd44a494f76b96dd860b8b9 commit refs/patches/master/remove +% guilt pop +Now at remove. +% git for-each-ref +ffb7faa126a6d91bcdd44a494f76b96dd860b8b9 commitrefs/heads/master +37d588cc39848368810e88332bd03b083f2ce3ac commitrefs/patches/master/add +33633e7a1aa31972f125878baf7807be57b1672d commit refs/patches/master/modify +ffb7faa126a6d91bcdd44a494f76b96dd860b8b9 commit refs/patches/master/remove +% guilt push +Applying patch..mode +Patch applied. +% git for-each-ref +ccd56089d1b5305a9d35617cb7f6f4b06ffa68ba commitrefs/heads/master +37d588cc39848368810e88332bd03b083f2ce3ac commitrefs/patches/master/add +ccd56089d1b5305a9d35617cb7f6f4b06ffa68ba
[GUILT v3 30/31] Added a short style guide, and Emacs settings.
Signed-off-by: Per Cederqvist ced...@opera.com Signed-off-by: Josef 'Jeff' Sipek jef...@josefsipek.net --- .dir-locals.el | 3 +++ Documentation/Contributing | 15 +++ 2 files changed, 18 insertions(+) create mode 100644 .dir-locals.el diff --git a/.dir-locals.el b/.dir-locals.el new file mode 100644 index 000..50ef2b7 --- /dev/null +++ b/.dir-locals.el @@ -0,0 +1,3 @@ +((nil . ((indent-tabs-mode . t) +(tab-width . 8))) + (sh-mode . ((sh-basic-offset . 8 diff --git a/Documentation/Contributing b/Documentation/Contributing index abf3480..0da49d6 100644 --- a/Documentation/Contributing +++ b/Documentation/Contributing @@ -4,6 +4,21 @@ Documentation/SubmittingPatches file. :) 1) Hack on the code a bit +Please follow this style guide: + + - Use tabs for indentation. + + - Put then on the same line as if. + + - Follow the style of the existing code, except if it breaks the + above guidlines. + + - If you change the code to conform to the style guide, please do so + in a separate commit that does not change anything else. + +Please check that you change does not break make test. Please add +new testcases for any new functionality, and if you fix a bug. + 2) Make a patch: Use diff -up or diff -uprN to create patches. Or simply use git to -- 1.8.3.1 -- To unsubscribe from this list: send the line unsubscribe git in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[GUILT v3 13/31] Check that guilt header '.*' fails.
Signed-off-by: Per Cederqvist ced...@opera.com Signed-off-by: Josef 'Jeff' Sipek jef...@josefsipek.net --- regression/t-028.out | 7 +++ regression/t-028.sh | 4 2 files changed, 11 insertions(+) diff --git a/regression/t-028.out b/regression/t-028.out index 1564c09..ea72a3a 100644 --- a/regression/t-028.out +++ b/regression/t-028.out @@ -49,3 +49,10 @@ Signed-off-by: Commiter Name commiter@email % guilt header non-existant Patch non-existant is not in the series +% guilt header .* +.* does not uniquely identify a patch. Did you mean any of these? + modify + add + remove + mode + patch-with-some-desc diff --git a/regression/t-028.sh b/regression/t-028.sh index 88e9adb..2ce0378 100755 --- a/regression/t-028.sh +++ b/regression/t-028.sh @@ -31,4 +31,8 @@ done shouldfail guilt header non-existant +# This is an evil variant of a non-existant patch. However, this +# patch name is a regexp that just happens to match an existing patch. +shouldfail guilt header '.*' + # FIXME: how do we check that -e works? -- 1.8.3.1 -- To unsubscribe from this list: send the line unsubscribe git in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [GUILT v2 28/29] Added guilt.reusebranch configuration option.
On Wed, May 14, 2014 at 5:53 PM, Jeff Sipek jef...@josefsipek.net wrote: On Tue, May 13, 2014 at 10:31:04PM +0200, Per Cederqvist wrote: When the option is true (the default), Guilt does not create a new Git branch when patches are applied. This way, you can switch between Guilt 0.35 and the current version of Guilt with no issues. At a future time, maybe a year after Guilt with guilt.reusebranch support is released, the default should be changed to false to take advantage of the ability to use a separate Git branch when patches are applied. Signed-off-by: Per Cederqvist ced...@opera.com --- guilt| 28 +++- regression/scaffold | 1 + regression/t-062.out | 441 +++ regression/t-062.sh | 137 4 files changed, 601 insertions(+), 6 deletions(-) create mode 100644 regression/t-062.out create mode 100755 regression/t-062.sh ... diff --git a/guilt b/guilt index 9947acc..7c830eb 100755 --- a/guilt +++ b/guilt ... @@ -928,13 +935,22 @@ else die Unsupported operating system: $UNAME_S fi -if [ $branch = $raw_git_branch ] [ -n `get_top 2/dev/null` ] -then -# This is for compat with old repositories that still have a -# pushed patch without the new-style branch prefix. -old_style_prefix=true +if [ -n `get_top 2/dev/null` ]; then + # If there is at least one pushed patch, we set + # old_style_prefix according to how it was pushed. It is only + # possible to change the prefix style while no patches are + # applied. + if [ $branch = $raw_git_branch ]; then + old_style_prefix=true + else + old_style_prefix=false + fi else -old_style_prefix=false + if $reuse_branch; then + old_style_prefix=true + else + old_style_prefix=false + fi I don't know if this is a good idea or not, but: old_style_prefix=$reuse_branch It saves a few lines. I'll use that construct in v3. fi _main $@ diff --git a/regression/scaffold b/regression/scaffold index e4d7487..e4d2f35 100644 --- a/regression/scaffold +++ b/regression/scaffold @@ -93,6 +93,7 @@ function setup_git_repo git config log.date default git config log.decorate no git config guilt.diffstat false + git config guilt.reusebranch false } function setup_guilt_repo ... diff --git a/regression/t-062.sh b/regression/t-062.sh new file mode 100755 index 000..85596ca --- /dev/null +++ b/regression/t-062.sh @@ -0,0 +1,137 @@ ... Hidden here was a broken comment. The new one at the start of the file will say: # Test that the guilt.reusebranch=true setting works. This entire file is mostly a copy of t-061.sh, but slightly adjusted to use guilt.reusebranch=true. I'm not sure it covers all that should be tested. On the other hand, I'm not sure how much that setting needs to be tested. +function fixup_time_info +{ + touch -a -m -t $TOUCH_DATE .git/patches/master/$1 +} + +cmd setup_repo + +cmd git config guilt.reusebranch true + +cmd guilt push -a +cmd list_files +cmd git for-each-ref + +cmd git for-each-ref + +cmd list_files duplicate list_files for-each-ref Fixed. + +for i in `seq 5`; do + if [ $i -ge 5 ]; then + shouldfail guilt pop + else + cmd guilt pop + fi + cmd git for-each-ref + cmd guilt push + cmd git for-each-ref + cmd guilt pop + cmd git for-each-ref +done + +# Check that pop -a does the right thing. What exactly is the right thing? no-op since the above loop poped everything? (I'd make the comment say what the right thing is.) I'll rephrase that block of code like this: # Check that pop -a properly pops all patches. cmd guilt push -a cmd git for-each-ref cmd guilt pop -a cmd git for-each-ref Is that more clear? The test pushes all patches, checks that they are applied, removes them, checks that it worked. Jeff. -- In personal conversations with technical people, I call myself a hacker. But when I'm talking to journalists I just say programmer or something like that. - Linus Torvalds -- To unsubscribe from this list: send the line unsubscribe git in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [GUILT v2 06/29] Fix the do_get_patch function.
On Tue, May 13, 2014 at 11:13 PM, Jeff Sipek jef...@josefsipek.net wrote: On Tue, May 13, 2014 at 10:30:42PM +0200, Per Cederqvist wrote: A patch file consists of: (1) the description (2) optional diffstat (3) the patches When extracting the patch, we only want part 3. The do_get_patch used to give us part 2 and part 3. That made for instance this series of operations fail if guilt.diffstat is true: guilt push empty-1 guilt push empty-2 guilt pop guilt fold empty-2 guilt pop guilt push I would probably include the actual error here. I got the following (using patch names a b): $ guilt pop Now at a. $ guilt fold b error: No changes $ guilt pop All patches popped. $ guilt pu Applying patch..a error: No changes To force apply this patch, use 'guilt push -f' A bit strange. I see that I made an error in the commands. It should be guilt new empty-1 and guilt new empty-2. The updated example in the commit message looks like this: $ guilt new empty-1 $ guilt new empty-2 $ guilt pop Now at empty-1 $ guilt fold empty-2 $ guilt pop All patches popped. $ guilt push Applying patch..empty-1 fatal: unrecognized input To force apply this patch, use 'guilt push -f' The diff itself is good. Signed-off-by: Josef 'Jeff' Sipek jef...@josefsipek.net Unless you object I'll add this signed-off line even though I'm improving the commit message in preparation for version 3 of the patch series. /ceder Signed-off-by: Per Cederqvist ced...@opera.com --- guilt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/guilt b/guilt index 8701481..3fc524e 100755 --- a/guilt +++ b/guilt @@ -334,7 +334,7 @@ do_get_patch() { awk ' BEGIN{} -/^(diff |---$|--- )/ {patch = 1} +/^(diff |--- )/ {patch = 1} patch == 1 {print $0} END{} ' $1 -- 1.8.3.1 -- I already backed up the [server] once, I can do it again. - a sysadmin threatening to do more frequent backups -- To unsubscribe from this list: send the line unsubscribe git in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [GUILT v2 07/29] Added test cases for guilt fold.
On Tue, May 13, 2014 at 11:30 PM, Jeff Sipek jef...@josefsipek.net wrote: On Tue, May 13, 2014 at 10:30:43PM +0200, Per Cederqvist wrote: Test that we can combine any combination of patches with empty and non-empty messages, both with and without guilt.diffstat. (All patches are empty.) Signed-off-by: Per Cederqvist ced...@opera.com --- regression/t-035.out | 467 +++ regression/t-035.sh | 62 +++ 2 files changed, 529 insertions(+) create mode 100644 regression/t-035.out create mode 100755 regression/t-035.sh ... diff --git a/regression/t-035.sh b/regression/t-035.sh new file mode 100755 index 000..e914b32 --- /dev/null +++ b/regression/t-035.sh @@ -0,0 +1,62 @@ +#!/bin/bash +# +# Test the fold code +# + +source $REG_DIR/scaffold + +cmd setup_repo + +function fixup_time_info +{ + cmd guilt pop + touch -a -m -t $TOUCH_DATE .git/patches/master/$1 + cmd guilt push +} + +function empty_patch +{ + cmd guilt new empty$1 + fixup_time_info empty$1 +} + +function nonempty_patch +{ + if [ $1 = -2 ]; then + msg=Another commit message. + else + msg=A commit message. + fi + + cmd guilt new -f -s -m $msg nonempty$1 + fixup_time_info nonempty$1 +} + +for using_diffstat in true false; do + cmd git config guilt.diffstat $using_diffstat + for patcha in empty nonempty; do + for patchb in empty nonempty; do + + if [ $patcha = $patchb ] + then I know that this is before patch 29, but ... style? ;) Otherwise, looks good. I like this way better than the unrolled loop in v1 of this patch. Signed-off-by: Josef 'Jeff' Sipek jef...@josefsipek.net It is hard to change a habit. :-) I'll fix this and add your signed-off-by. /ceder + suffixa=-1 + suffixb=-2 + else + suffixa= + suffixb= + fi + + echo %% $patcha + $patchb (diffstat=$using_diffstat) + ${patcha}_patch $suffixa + ${patchb}_patch $suffixb + cmd guilt pop + cmd guilt fold $patchb$suffixb + fixup_time_info $patcha$suffixa + cmd list_files + cmd guilt pop + cmd guilt delete -f $patcha$suffixa + cmd list_files + + done + done +done -- 1.8.3.1 -- *NOTE: This message is ROT-13 encrypted twice for extra protection* -- To unsubscribe from this list: send the line unsubscribe git in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [GUILT v2 16/29] Fix backslash handling when creating names of imported patches.
On Wed, May 14, 2014 at 12:09 AM, Jeff Sipek jef...@josefsipek.net wrote: On Tue, May 13, 2014 at 10:30:52PM +0200, Per Cederqvist wrote: The 'echo %s' construct sometimes processes escape sequences. (This %s? Should this be $s? Yes. Will fix that typo in v3 of the patch series. /ceder Otherwise, looks good. happens, for instance, under Ubuntu 14.04 when /bin/sh is actually dash.) We don't want that to happen when we are importing commits, so use 'printf %s $s' instead. (The -E option of bash that explicitly disables backslash expansion is not portable; it is not supported by dash.) Signed-off-by: Per Cederqvist ced...@opera.com --- guilt-import-commit | 2 +- regression/t-034.out | 14 +++--- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/guilt-import-commit b/guilt-import-commit index 6260c56..45f2404 100755 --- a/guilt-import-commit +++ b/guilt-import-commit @@ -30,7 +30,7 @@ for rev in `git rev-list $rhash`; do # Try to convert the first line of the commit message to a # valid patch name. - fname=`echo $s | sed -e s//and/g -e s/[ :]/_/g -e s,[/\\],-,g \ + fname=`printf %s $s | sed -e s//and/g -e s/[ :]/_/g -e s,[/\\],-,g \ -e s/['\\[{}]//g -e 's/]//g' -e 's/\*/-/g' \ -e 's/\?/-/g' -e 's/\.\.\.*/./g' -e 's/^\.//' \ -e 's/\.patch$//' -e 's/\.$//' | tr A-Z a-z` diff --git a/regression/t-034.out b/regression/t-034.out index 7bc9459..bda4399 100644 --- a/regression/t-034.out +++ b/regression/t-034.out @@ -236,7 +236,7 @@ Date: Mon Jan 1 00:00:00 2007 + About to begin conversion... Current head: 2a8b1889aa5066193bac978e6bf5073ffcfa6541 Converting 2a8b1889 as can-have-embedded-single-slashes -Converting 0a46f8fa as backslash-isorbidden +Converting 0a46f8fa as backslash-is-forbidden Converting aedb74fd as x Converting 30187ed0 as cannot@have@the@sequence@at-brace Converting 106e8e5a as cannot_end_in_ @@ -300,7 +300,7 @@ Applying patch..cannot@have@the@sequence@at-brace.patch Patch applied. Applying patch..x.patch Patch applied. -Applying patch..backslash-isorbidden.patch +Applying patch..backslash-is-forbidden.patch Patch applied. Applying patch..can-have-embedded-single-slashes.patch Patch applied. @@ -311,7 +311,7 @@ Date: Mon Jan 1 00:00:00 2007 + Can/have/embedded/single/slashes -commit 7c3ffa4f940c862e9f11f5d4a5ae421f7a8d3141 (refs/patches/master/backslash-isorbidden.patch) +commit 7c3ffa4f940c862e9f11f5d4a5ae421f7a8d3141 (refs/patches/master/backslash-is-forbidden.patch) Author: Author Name author@email Date: Mon Jan 1 00:00:00 2007 + @@ -518,8 +518,6 @@ d .git/patches/master d .git/refs/patches d .git/refs/patches/master f 06beca7069b9e576bd431f65d13862ed5d3e2a0f .git/patches/master/ctrlisforbidden.patch -f 08267ec6783ea9d1adae55b275198f7594764ed0 .git/patches/master/series -f 08267ec6783ea9d1adae55b275198f7594764ed0 .git/patches/master/status f 09b7e9be44ae5ec3a4bb30f5ee9d4ebc2c042f64 .git/patches/master/two_consecutive_dots_(.)_is_forbidden.patch f 0b971c9a17aeca2319c93d700ffd98acc2a93451 .git/patches/master/question-mark-is-forbidden.patch f 2b8392f63d61efc12add554555adae30883993cc .git/patches/master/cannot-end-in-slash-.patch @@ -529,7 +527,7 @@ f 34e07c584032df137f19bdb66d93f316f00a5ac8 .git/patches/master/tildeisforbidden f 49bab499826b63deb2bd704629d60c7268c57aee .git/patches/master/the_sequence_-._is_forbidden.patch f 5bcddb8ccb6e6e5e8a61e9e56cb2e0f70cbab2f5 .git/patches/master/cannot@have@the@sequence@at-brace.patch f 637b982fe14a240de181ae63226b27e0c406b3dc .git/patches/master/asterisk-is-forbidden.patch -f 698f8a7d41a64e3b6be1a3eba86574078b22a5f3 .git/patches/master/backslash-isorbidden.patch +f 698f8a7d41a64e3b6be1a3eba86574078b22a5f3 .git/patches/master/backslash-is-forbidden.patch f 7b103c3c7ae298cd2334f6f49da48bae1424f77b .git/patches/master/crisalsoforbidden.patch f 9b810b8c63779c51d2e7f61ab59cd49835041563 .git/patches/master/x.patch f a22958d9ae9976fd7b2b5a9d0bcd44bf7ad9b08a .git/patches/master/caretisforbidden.patch @@ -537,6 +535,8 @@ f ab325bf5a432937fc6f231d3e8a773a62d53952b .git/patches/master/multiple-slashes f cb9cffbd4465bddee266c20ccebd14eb687eaa89 .git/patches/master/delisforbidden.patch f d0885a1a1fdee0fd1e4fedce3f7acd3100540bc4 .git/patches/master/openbracketisforbidden.patch f d2903523fb66a346596eabbdd1bda4e52b266440 .git/patches/master/check-multiple-.-dots-.-foo.patch +f da90de1c84138194524994e0bc3bc4ca8189c999 .git/patches/master/series +f da90de1c84138194524994e0bc3bc4ca8189c999 .git/patches/master/status f dfc11f76394059909671af036598c5fbe33001ba .git/patches/master/space_is_forbidden.patch f e47474c52d6c893f36d0457f885a6dd1267742bb .git/patches/master/colon_is_forbidden.patch f e7a5f8912592d9891e6159f5827c8b4f372cc406 .git/patches/master
Re: [GUILT v2 25/29] guilt push now fails when there are no more patches to push.
On Tue, May 13, 2014 at 11:41 PM, Jeff Sipek jef...@josefsipek.net wrote: On Tue, May 13, 2014 at 10:31:01PM +0200, Per Cederqvist wrote: This makes it easier to script operations on the entire queue, for example run the test suite on each patch in the queue: guilt pop -a;while guilt push; do make test||break; done This brings guilt push in line with the push operation in Mercurial Queues (hg qpush), which fails when there are no patches to apply. Updated the test suite. guilt push -a still does not fail. (It successfully manages to ensure that all patches are pushed, even if it did not have to do anything to make it so.) Signed-off-by: Per Cederqvist ced...@opera.com --- guilt-push | 19 ++- regression/t-020.out | 89 regression/t-020.sh | 13 +++- 3 files changed, 113 insertions(+), 8 deletions(-) ... diff --git a/regression/t-020.sh b/regression/t-020.sh index 906aec6..0f9f85d 100755 --- a/regression/t-020.sh +++ b/regression/t-020.sh @@ -26,6 +26,17 @@ guilt series | while read n ; do done # +# pushing when there is nothing to push +# + +shouldfail guilt push +cmd guilt push -a + +cmd list_files + +cmd git log -p I don't particularly care for the git-log. Otherwise it looks good. Signed-off-by: Josef 'Jeff' Sipek jef...@josefsipek.net In my defense, I was just continuing the pattern already established in that file. Anyhow, I'll add a new commit to the patch series that removes all git log -p from all tests. (They are present in both t-020.sh and t-021.sh.) /ceder + +# # pop all # cmd guilt pop --all @@ -61,7 +72,7 @@ cmd guilt pop --all npatches=`guilt series | wc -l` for n in `_seq -2 $npatches`; do - if [ $n -ge 0 ]; then + if [ $n -gt 0 ]; then cmd guilt push -n $n else shouldfail guilt push -n $n -- 1.8.3.1 -- Evolution, n.: A hypothetical process whereby infinitely improbable events occur with alarming frequency, order arises from chaos, and no one is given credit. -- To unsubscribe from this list: send the line unsubscribe git in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [GUILT v2 00/29] Teach guilt import-commit how to create legal patch names, and more
On Tue, May 13, 2014 at 11:29 PM, Per Cederqvist ced...@opera.com wrote: On Tue, May 13, 2014 at 10:54 PM, Jeff Sipek jef...@josefsipek.net wrote: On Tue, May 13, 2014 at 04:45:47PM -0400, Theodore Ts'o wrote: On Tue, May 13, 2014 at 10:30:36PM +0200, Per Cederqvist wrote: ... - Changed behavior: by default, guilt no longer changes branch when you push a patch. You need to do git config guilt.reusebranch false to re-enable that. This patch sets the default value of guilt.reusebranch to true; it should in my opinion change to false a year or two after the next release. We've been living with the origin - guilt/origin branch change for a year already, and in fact, these days I've gotten used to the new behavior. Is it really worth it to change the default? So, at first I was skeptical about the branch name prefix change. I've used it for about a year now, and I love it. When I first read Per's idea to change the default to the old-style, I was a bit sad but I understand the motivation. I'm open to either mode being the default since it's easy enough for me to change it for me (thanks, ~/.gitconfig) but I think more people should benefit from the added safety against accidental git-push. (I also like being able to use guilt/master..master to get only the commits I care about.) Thoughts? I don't have a strong opinion on which the default value should be. The scenario where it matters, when you run multiple versions of guilt against the same directory, is probably very rare in practice. If it is mentioned in the release note that it can be changed if needed, that is probably good enough. /ceder I will change the default value to false in the next version of the patch series, unless there are objections. I plan to send it to the list Friday morning. /ceder -- To unsubscribe from this list: send the line unsubscribe git in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [GUILT v2 08/29] Added more test cases for guilt new: empty patches.
On Wed, May 14, 2014 at 7:10 PM, Jeff Sipek jef...@josefsipek.net wrote: On Tue, May 13, 2014 at 10:30:44PM +0200, Per Cederqvist wrote: Test that empty patches are handled correctly, both with and without the guilt.diffstat configuration option. Signed-off-by: Per Cederqvist ced...@opera.com --- regression/t-020.out | 250 +++ regression/t-020.sh | 60 + 2 files changed, 310 insertions(+) diff --git a/regression/t-020.out b/regression/t-020.out index af45734..7e07efa 100644 --- a/regression/t-020.out +++ b/regression/t-020.out @@ -1128,3 +1128,253 @@ f 9c18cc7abe6b87f18503714a80a677b4094eb457 .git/patches/master/add ... +% git log -p +commit c7a139f532a43c3c8b0e068cac04f8f6af0f94e1 +Author: Author Name author@email +Date: Mon Jan 1 00:00:00 2007 + + +patch empty.patch + +commit d4850419ccc1146c7169f500725ce504b9774ed0 +Author: Author Name author@email +Date: Mon Jan 1 00:00:00 2007 + + +initial + +Signed-off-by: Commiter Name commiter@email + +diff --git a/def b/def +new file mode 100644 +index 000..8baef1b +--- /dev/null b/def +@@ -0,0 +1 @@ ++abc +% git config guilt.diffstat false +--- + I'm a bit confused about the above. It looks like contents of an empty patch with an empty diffstat. But the only time I see a cat in the .sh file is when you rewrite... oh I got it. I'll comment about it by the 'cat'. ... diff --git a/regression/t-020.sh b/regression/t-020.sh index cdd08ba..906aec6 100755 --- a/regression/t-020.sh +++ b/regression/t-020.sh @@ -5,6 +5,13 @@ source $REG_DIR/scaffold +function fixup_time_info +{ + cmd guilt pop + touch -a -m -t $TOUCH_DATE .git/patches/master/$1 + cmd guilt push +} + cmd setup_repo # @@ -69,6 +76,59 @@ done cmd list_files +# push an empty patch with no commit message +cmd guilt new empty.patch +fixup_time_info empty.patch +cmd list_files +cmd git log -p + +# Ensure we can push the empty patch even when guilt.diffstat is true. +cmd git config guilt.diffstat true +cmd guilt refresh +fixup_time_info empty.patch +cmd list_files +cmd git log -p +cmd git config guilt.diffstat false + +# Let the patch have a commit message, but no data. +cat .git/patches/master/empty.patch EOF cat .git/.../empty.patch EOF ... EOF Otherwise, you'll just cat the existing patch and that's it. Yes. The intent was to modify empty.patch. This is a bit embarrassing, since it should have been obvious from the output of git log -p that the modification didn't work as I intended. :-) I'll fix in the v3 series. /ceder +Fix a bug. + +From: Per Cederqvist ce...@lysator.liu.se + +This commit fixes a serious bug. + +FIXME: +- add a test case +- track down the bug +- actually fix it +EOF + +fixup_time_info empty.patch +cmd list_files +cmd git log -p + +# And once more, with an empty diffstat. + +cmd git config guilt.diffstat true +cmd guilt refresh +fixup_time_info empty.patch +cmd list_files +cmd git log -p + +# Restore the diffstat setting and remove the empty patch. +cmd git config guilt.diffstat false +cmd guilt refresh +fixup_time_info empty.patch +cmd list_files +cmd git log -p +# (Cannot delete an applied patch) +shouldfail guilt delete empty.patch +cmd guilt pop -a +cmd guilt delete -f empty.patch +cmd list_files +cmd git log -p + # FIXME: # --all # -a -- 1.8.3.1 -- Fact: 23.6% of all statistics are generated randomly. -- To unsubscribe from this list: send the line unsubscribe git in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[GUILT v2 00/29] Teach guilt import-commit how to create legal patch names, and more
This is version two of the patch series I sent back on 21 Mar 2014. I have addressed all feedback to date, updated the coding style, and added signed-off-by lines from Jeff Sipek for those commits that I have received an explicit approval from him (but only if I have not made any other change to that particular commit). I have also added one more patch: a very limited coding style guide, and accompanying settings for Emacs. See the last commit in the series. All other commits have retained their numbering. To see how the patches have evolved, you might find http://www.lysator.liu.se/~ceder/guilt-oslo-2014-v2/ useful. It displays diffs of all the patches, in pdiffdiff output format. Here is the original blurb for the series, slightly edited: I recently found myself sitting on a train with a computer in front of me. I tried to use guilt import-commit, which seemed to work, but when I tried to guilt push the commits I had just imported I got some errors. It turned out that guilt import-commit had generated invalid patch names. I decided to fix the issue, and write a test case that demonstrated the problem. One thing led to another, and here I am, a few late nights at a hotel and a return trip on the train later, submitting a patch series in 28 parts. Sorry about the number of patches, but this is what happens when you uncover a bug while writing a test case for the bug you uncovered while writing a test case for your original problem. The patch series consists of: - A number of fixes to the test suite. - A number of bug fixes which I hope are non-controversial. Most of the fixes have test cases. - Changed behavior: guilt push when there is nothing more to push now uses exit status 1. This makes it possible to write shell loops such as while guilt push; do make test||break; done. Also, guilt pop when no patches are applied also uses exit status 1. (This aligns guilt push and guilt pop with how hg qpush and hg qpop has worked for several years.) - Changed behavior: by default, guilt no longer changes branch when you push a patch. You need to do git config guilt.reusebranch false to re-enable that. This patch sets the default value of guilt.reusebranch to true; it should in my opinion change to false a year or two after the next release. - The humble beginnings of a coding style guide. A more detailed overview of the patches: 1. Some tests fail if git config guilt.diffstat true is in effect. 2-4. Some commands fail if run from a directory with spaces in its name. 5. guilt new had an overly restrictive argument parser. 6-8. guilt.diffstat could break guilt fold and guilt new. 9-10. The test suite did not test exit status properly. 11. Remove pointless redirections in the test suite. 12-13. guilt header tried to check if a patch existed, but the check was broken. 14-16. Various parts of guilt tried to ensure that patch names were legal git branch names, but failed. 17-20. guilt graph failed when no patch was applied, and when a branch name contained a comma or a quote. 21-23. git config log.decorate short caused guilt import-commit, guilt patchbomb and guilt rebase to fail in various ways. 24. Patches may contain backslashes, but various informative messages from guilt did backslash processing. 25-26. guilt push and guilt pop should fail when there is nothing to do. 27-28. These two commits were things I intended to contribute a while back, when contributing the Change git branch when patches are applied change (commit 67d3af63f422). These commits makes that behavior optional, and it defaults to being disabled, so that you can use both Guilt v0.35 (and earlier) and the current Guilt code against the same repo. These commits add some code complexity, and you might want to skip them if you think the current behavior is better. 29. A coding style guide, with Emacs support. This patch series is also available on http://repo.or.cz/w/guilt/ceder.git in the oslo-2014-v2 branch. If you already have a copy of guilt, you should be able to fetch that branch with something like: git remote add ceder http://repo.or.cz/r/guilt/ceder.git git fetch ceder refs/heads/oslo-2014-v2:refs/remotes/ceder/oslo-2014-v2 A few of the regression/t-*.out files contain non-ASCII characters. I hope they survive the mail transfer; if not, please use the repo above to fetch the commits. Per Cederqvist (29): The tests should not fail if guilt.diffstat is set. Allow guilt delete -f to run from a dir which contains spaces. Added test case for guilt delete -f. Allow guilt import-commit to run from a dir which contains spaces. guilt new: Accept more than 4 arguments. Fix the do_get_patch function. Added test cases for guilt fold. Added more test cases for guilt new: empty patches. Test suite: properly check the exit status of commands. Run
[GUILT v2 01/29] The tests should not fail if guilt.diffstat is set.
Explicitly set guilt.diffstat to its default value. Without this, the 027 test (and possibly others) fail if guilt.diffstat is set to true in ~/.gitconfig. Signed-off-by: Per Cederqvist ced...@opera.com Signed-off-by: Josef 'Jeff' Sipek jef...@josefsipek.net --- regression/scaffold | 1 + 1 file changed, 1 insertion(+) diff --git a/regression/scaffold b/regression/scaffold index 546d8c6..5c8b73e 100644 --- a/regression/scaffold +++ b/regression/scaffold @@ -87,6 +87,7 @@ function setup_git_repo # Explicitly set config that the tests rely on. git config log.date default git config log.decorate no + git config guilt.diffstat false } function setup_guilt_repo -- 1.8.3.1 -- To unsubscribe from this list: send the line unsubscribe git in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[GUILT v2 02/29] Allow guilt delete -f to run from a dir which contains spaces.
Signed-off-by: Per Cederqvist ced...@opera.com Signed-off-by: Josef 'Jeff' Sipek jef...@josefsipek.net --- guilt-delete | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/guilt-delete b/guilt-delete index 3e394f8..967ac10 100755 --- a/guilt-delete +++ b/guilt-delete @@ -49,7 +49,7 @@ series_remove_patch $patch guilt_hook delete $patch -[ ! -z $force ] rm -f $GUILT_DIR/$branch/$patch +[ ! -z $force ] rm -f $GUILT_DIR/$branch/$patch exit 0 -- 1.8.3.1 -- To unsubscribe from this list: send the line unsubscribe git in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[GUILT v2 03/29] Added test case for guilt delete -f.
Ensure that the file really is deleted. Signed-off-by: Per Cederqvist ced...@opera.com Signed-off-by: Josef 'Jeff' Sipek jef...@josefsipek.net --- regression/t-026.out | 15 +++ regression/t-026.sh | 5 - 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/regression/t-026.out b/regression/t-026.out index 3b9fb14..be50b48 100644 --- a/regression/t-026.out +++ b/regression/t-026.out @@ -29,3 +29,18 @@ f 7848194fd2e9ee0eb6589482900687d799d60a12 .git/patches/master/series f 9c18cc7abe6b87f18503714a80a677b4094eb457 .git/patches/master/add f bc9ab2e0f5db99d483961e956e814d963f0309f8 .git/patches/master/modify f da39a3ee5e6b4b0d3255bfef95601890afd80709 .git/patches/master/status +% guilt new delete-me +% guilt pop +All patches popped. +% guilt delete -f delete-me +% list_files +d .git/patches +d .git/patches/master +d .git/refs/patches +d .git/refs/patches/master +f 22930c6d1f1938f298a4fca51c57e4b47171db21 .git/patches/master/mode +f 413390f3906f16f30b054a4fb86c1e014b964504 .git/patches/master/remove +f 7848194fd2e9ee0eb6589482900687d799d60a12 .git/patches/master/series +f 9c18cc7abe6b87f18503714a80a677b4094eb457 .git/patches/master/add +f bc9ab2e0f5db99d483961e956e814d963f0309f8 .git/patches/master/modify +f da39a3ee5e6b4b0d3255bfef95601890afd80709 .git/patches/master/status diff --git a/regression/t-026.sh b/regression/t-026.sh index 0ccdf85..e25d0df 100755 --- a/regression/t-026.sh +++ b/regression/t-026.sh @@ -20,4 +20,7 @@ cmd guilt delete add cmd list_files -# FIXME: test delete -f +cmd guilt new delete-me +cmd guilt pop +cmd guilt delete -f delete-me +cmd list_files -- 1.8.3.1 -- To unsubscribe from this list: send the line unsubscribe git in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[GUILT v2 04/29] Allow guilt import-commit to run from a dir which contains spaces.
Signed-off-by: Per Cederqvist ced...@opera.com --- guilt-import-commit | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/guilt-import-commit b/guilt-import-commit index 20dcee2..f14647c 100755 --- a/guilt-import-commit +++ b/guilt-import-commit @@ -23,7 +23,7 @@ if ! must_commit_first; then fi disp About to begin conversion... 2 -disp Current head: `cat $GIT_DIR/refs/heads/\`git_branch\`` 2 +disp Current head: `git rev-parse \`git_branch\`` 2 for rev in `git rev-list $rhash`; do s=`git log --pretty=oneline -1 $rev | cut -c 42-` @@ -46,7 +46,7 @@ for rev in `git rev-list $rhash`; do do_make_header $rev echo git diff --binary $rev^..$rev - ) $GUILT_DIR/$branch/$fname + ) $GUILT_DIR/$branch/$fname # FIXME: grab the GIT_AUTHOR_DATE from the commit object and set the # timestamp on the patch @@ -68,6 +68,6 @@ for rev in `git rev-list $rhash`; do done disp Done. 2 -disp Current head: `cat $GIT_DIR/refs/heads/\`git_branch\`` 2 +disp Current head: `git rev-parse \`git_branch\`` 2 } -- 1.8.3.1 -- To unsubscribe from this list: send the line unsubscribe git in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[GUILT v2 06/29] Fix the do_get_patch function.
A patch file consists of: (1) the description (2) optional diffstat (3) the patches When extracting the patch, we only want part 3. The do_get_patch used to give us part 2 and part 3. That made for instance this series of operations fail if guilt.diffstat is true: guilt push empty-1 guilt push empty-2 guilt pop guilt fold empty-2 guilt pop guilt push Signed-off-by: Per Cederqvist ced...@opera.com --- guilt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/guilt b/guilt index 8701481..3fc524e 100755 --- a/guilt +++ b/guilt @@ -334,7 +334,7 @@ do_get_patch() { awk ' BEGIN{} -/^(diff |---$|--- )/ {patch = 1} +/^(diff |--- )/ {patch = 1} patch == 1 {print $0} END{} ' $1 -- 1.8.3.1 -- To unsubscribe from this list: send the line unsubscribe git in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[GUILT v2 05/29] guilt new: Accept more than 4 arguments.
The argument parser arbitrarily refused to accept more than 4 arguments. That made it impossible to run guilt new -f -s -m msg patch. Removed the checks for the number of arguments from the guilt new parser -- the other checks that are already there are enough to catch all errors. Give a better error message if -m isn't followed by a message argument. Signed-off-by: Per Cederqvist ced...@opera.com Signed-off-by: Josef 'Jeff' Sipek jef...@josefsipek.net --- guilt-new | 7 +++ 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/guilt-new b/guilt-new index bb68924..9528438 100755 --- a/guilt-new +++ b/guilt-new @@ -11,10 +11,6 @@ fi _main() { -if [ $# -lt 1 ] || [ $# -gt 4 ]; then - usage -fi - while [ $# -gt 0 ] ; do case $1 in -f) @@ -31,6 +27,9 @@ while [ $# -gt 0 ] ; do fi ;; -m) + if [ $# -eq 1 ]; then + usage + fi msg=$2 shift -- 1.8.3.1 -- To unsubscribe from this list: send the line unsubscribe git in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[GUILT v2 08/29] Added more test cases for guilt new: empty patches.
Test that empty patches are handled correctly, both with and without the guilt.diffstat configuration option. Signed-off-by: Per Cederqvist ced...@opera.com --- regression/t-020.out | 250 +++ regression/t-020.sh | 60 + 2 files changed, 310 insertions(+) diff --git a/regression/t-020.out b/regression/t-020.out index af45734..7e07efa 100644 --- a/regression/t-020.out +++ b/regression/t-020.out @@ -1128,3 +1128,253 @@ f 9c18cc7abe6b87f18503714a80a677b4094eb457 .git/patches/master/add f bacb4aad8a55fe4e7aa58a9ae169990bb764069f .git/patches/master/series f bc9ab2e0f5db99d483961e956e814d963f0309f8 .git/patches/master/modify f da39a3ee5e6b4b0d3255bfef95601890afd80709 .git/patches/master/status +% guilt new empty.patch +% guilt pop +All patches popped. +% guilt push +Applying patch..empty.patch +Patch applied. +% list_files +d .git/patches +d .git/patches/master +d .git/refs/patches +d .git/refs/patches/master +f 22930c6d1f1938f298a4fca51c57e4b47171db21 .git/patches/master/mode +f 413390f3906f16f30b054a4fb86c1e014b964504 .git/patches/master/remove +f 9c18cc7abe6b87f18503714a80a677b4094eb457 .git/patches/master/add +f bc9ab2e0f5db99d483961e956e814d963f0309f8 .git/patches/master/modify +f d15a1d2d34493f790c78ddacb8815b0b9536ee2b .git/patches/master/series +f da39a3ee5e6b4b0d3255bfef95601890afd80709 .git/patches/master/empty.patch +f e90b964f01cbef60bbe00c38c55d9ea86618a66a .git/patches/master/status +r c7a139f532a43c3c8b0e068cac04f8f6af0f94e1 .git/refs/patches/master/empty.patch +% git log -p +commit c7a139f532a43c3c8b0e068cac04f8f6af0f94e1 +Author: Author Name author@email +Date: Mon Jan 1 00:00:00 2007 + + +patch empty.patch + +commit d4850419ccc1146c7169f500725ce504b9774ed0 +Author: Author Name author@email +Date: Mon Jan 1 00:00:00 2007 + + +initial + +Signed-off-by: Commiter Name commiter@email + +diff --git a/def b/def +new file mode 100644 +index 000..8baef1b +--- /dev/null b/def +@@ -0,0 +1 @@ ++abc +% git config guilt.diffstat true +% guilt refresh +Patch empty.patch refreshed +% guilt pop +All patches popped. +% guilt push +Applying patch..empty.patch +Patch applied. +% list_files +d .git/patches +d .git/patches/master +d .git/refs/patches +d .git/refs/patches/master +f 22930c6d1f1938f298a4fca51c57e4b47171db21 .git/patches/master/mode +f 413390f3906f16f30b054a4fb86c1e014b964504 .git/patches/master/remove +f 7d261b8caad0f161c21daf5de65eeb521ff8c067 .git/patches/master/empty.patch +f 9c18cc7abe6b87f18503714a80a677b4094eb457 .git/patches/master/add +f bc9ab2e0f5db99d483961e956e814d963f0309f8 .git/patches/master/modify +f d15a1d2d34493f790c78ddacb8815b0b9536ee2b .git/patches/master/series +f da39a3ee5e6b4b0d3255bfef95601890afd80709 .git/patches/master/empty.patch~ +f e90b964f01cbef60bbe00c38c55d9ea86618a66a .git/patches/master/status +r c7a139f532a43c3c8b0e068cac04f8f6af0f94e1 .git/refs/patches/master/empty.patch +% git log -p +commit c7a139f532a43c3c8b0e068cac04f8f6af0f94e1 +Author: Author Name author@email +Date: Mon Jan 1 00:00:00 2007 + + +patch empty.patch + +commit d4850419ccc1146c7169f500725ce504b9774ed0 +Author: Author Name author@email +Date: Mon Jan 1 00:00:00 2007 + + +initial + +Signed-off-by: Commiter Name commiter@email + +diff --git a/def b/def +new file mode 100644 +index 000..8baef1b +--- /dev/null b/def +@@ -0,0 +1 @@ ++abc +% git config guilt.diffstat false +--- + +% guilt pop +All patches popped. +% guilt push +Applying patch..empty.patch +Patch applied. +% list_files +d .git/patches +d .git/patches/master +d .git/refs/patches +d .git/refs/patches/master +f 22930c6d1f1938f298a4fca51c57e4b47171db21 .git/patches/master/mode +f 413390f3906f16f30b054a4fb86c1e014b964504 .git/patches/master/remove +f 7d261b8caad0f161c21daf5de65eeb521ff8c067 .git/patches/master/empty.patch +f 9c18cc7abe6b87f18503714a80a677b4094eb457 .git/patches/master/add +f bc9ab2e0f5db99d483961e956e814d963f0309f8 .git/patches/master/modify +f d15a1d2d34493f790c78ddacb8815b0b9536ee2b .git/patches/master/series +f da39a3ee5e6b4b0d3255bfef95601890afd80709 .git/patches/master/empty.patch~ +f e90b964f01cbef60bbe00c38c55d9ea86618a66a .git/patches/master/status +r c7a139f532a43c3c8b0e068cac04f8f6af0f94e1 .git/refs/patches/master/empty.patch +% git log -p +commit c7a139f532a43c3c8b0e068cac04f8f6af0f94e1 +Author: Author Name author@email +Date: Mon Jan 1 00:00:00 2007 + + +patch empty.patch + +commit d4850419ccc1146c7169f500725ce504b9774ed0 +Author: Author Name author@email +Date: Mon Jan 1 00:00:00 2007 + + +initial + +Signed-off-by: Commiter Name commiter@email + +diff --git a/def b/def +new file mode 100644 +index 000..8baef1b +--- /dev/null b/def +@@ -0,0 +1 @@ ++abc +% git config guilt.diffstat true +% guilt refresh +Patch empty.patch refreshed +% guilt pop +All patches popped. +% guilt push +Applying patch..empty.patch