githug 0.2.4 → 0.2.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. data/README.md +2 -2
  2. data/levels/bisect.rb +14 -0
  3. data/levels/bisect/.githug/HEAD +1 -0
  4. data/levels/bisect/.githug/ORIG_HEAD +1 -0
  5. data/levels/bisect/.githug/config +5 -0
  6. data/levels/bisect/.githug/description +1 -0
  7. data/levels/bisect/.githug/hooks/applypatch-msg.sample +15 -0
  8. data/levels/bisect/.githug/hooks/commit-msg.sample +24 -0
  9. data/levels/bisect/.githug/hooks/post-commit.sample +8 -0
  10. data/levels/bisect/.githug/hooks/post-receive.sample +15 -0
  11. data/levels/bisect/.githug/hooks/post-update.sample +8 -0
  12. data/levels/bisect/.githug/hooks/pre-applypatch.sample +14 -0
  13. data/levels/bisect/.githug/hooks/pre-commit.sample +46 -0
  14. data/levels/bisect/.githug/hooks/pre-rebase.sample +172 -0
  15. data/levels/bisect/.githug/hooks/prepare-commit-msg.sample +36 -0
  16. data/levels/bisect/.githug/hooks/update.sample +128 -0
  17. data/levels/bisect/.githug/index +0 -0
  18. data/levels/bisect/.githug/info/exclude +6 -0
  19. data/levels/bisect/.githug/info/refs +5 -0
  20. data/levels/bisect/.githug/logs/HEAD +25 -0
  21. data/levels/bisect/.githug/logs/refs/heads/master +19 -0
  22. data/levels/bisect/.githug/objects/info/packs +2 -0
  23. data/levels/bisect/.githug/objects/pack/pack-34f18db272b06cca4ff6cbbdbc96d496f6b28995.idx +0 -0
  24. data/levels/bisect/.githug/objects/pack/pack-34f18db272b06cca4ff6cbbdbc96d496f6b28995.pack +0 -0
  25. data/levels/bisect/.githug/packed-refs +6 -0
  26. data/levels/bisect/makefile +2 -0
  27. data/levels/bisect/prog.rb +3 -0
  28. data/levels/bisect/test.rb +4 -0
  29. data/levels/cherry-pick.rb +1 -0
  30. data/levels/cherry-pick/.githug/hooks/applypatch-msg.sample +0 -0
  31. data/levels/cherry-pick/.githug/hooks/commit-msg.sample +0 -0
  32. data/levels/cherry-pick/.githug/hooks/post-update.sample +0 -0
  33. data/levels/cherry-pick/.githug/hooks/pre-applypatch.sample +0 -0
  34. data/levels/cherry-pick/.githug/hooks/pre-commit.sample +0 -0
  35. data/levels/cherry-pick/.githug/hooks/pre-rebase.sample +0 -0
  36. data/levels/cherry-pick/.githug/hooks/prepare-commit-msg.sample +0 -0
  37. data/levels/cherry-pick/.githug/hooks/update.sample +0 -0
  38. data/levels/cherry-pick/.githug/index +0 -0
  39. data/levels/init.rb +1 -1
  40. data/levels/rename_commit.rb +1 -1
  41. data/levels/restore.rb +28 -0
  42. data/lib/githug/level.rb +2 -1
  43. data/lib/githug/repository.rb +1 -5
  44. data/lib/githug/version.rb +1 -1
  45. data/spec/githug/repository_spec.rb +1 -13
  46. metadata +83 -48
data/README.md CHANGED
@@ -75,7 +75,7 @@ You can also include multiple hints like this:
75
75
  "You can type `git` in your shell to get a list of available git commands",
76
76
  "Check the man for `git add`"]
77
77
 
78
- **note** Because `solution` is a Proc, you cannot prematurely return out of it and as a result, must put an implicit return on the last line of the solution block.
78
+ **note** Because `solution` is a Proc, you cannot prematurely return out of it and as a result, must put an explicit return on the last line of the solution block.
79
79
 
80
80
 
81
81
  solution do
@@ -86,7 +86,7 @@ You can also include multiple hints like this:
86
86
 
87
87
  By default, `setup` will remove all files from the game folder. You do not need to include a setup method if you don't want an initial git repository (if you are testing `git init` or only checking an answer.)
88
88
 
89
- You can call `repo.init` to initialize an empty repository with a .gitignore file. It takes a single parameter of false if you want to skip the initial commit of the .gitignore file.
89
+ You can call `repo.init` to initialize an empty repository.
90
90
 
91
91
  All methods called on `repo` are sent to the [grit gem](https://github.com/mojombo/grit) if the method does not exist, and you can use that for most git related commands (`repo.add`, `repo.commit`, etc.)
92
92
 
data/levels/bisect.rb ADDED
@@ -0,0 +1,14 @@
1
+ difficulty 3
2
+ description "A bug was introduced somewhere along the way. You know that running 'ruby prog.rb 5' should output 15. You can also run 'make test'. What are the first 7 chars of the hash of the commit that introduced the bug."
3
+
4
+ setup do
5
+ init_from_level
6
+ end
7
+
8
+ solution do
9
+ "94e162b" == request("What are the first 7 characters of the hash of the commit that introduced the bug?")
10
+ end
11
+
12
+ hint do
13
+ puts ["The fastest way to find the bug is with bisect.", "Start bisect with a good and bad commit, then run git bisect run make test."]
14
+ end
@@ -0,0 +1 @@
1
+ ref: refs/heads/master
@@ -0,0 +1 @@
1
+ bfb16eec1081387b586dc8009ef422cfff60b622
@@ -0,0 +1,5 @@
1
+ [core]
2
+ repositoryformatversion = 0
3
+ filemode = true
4
+ bare = false
5
+ logallrefupdates = true
@@ -0,0 +1 @@
1
+ Unnamed repository; edit this file 'description' to name the repository.
@@ -0,0 +1,15 @@
1
+ #!/bin/sh
2
+ #
3
+ # An example hook script to check the commit log message taken by
4
+ # applypatch from an e-mail message.
5
+ #
6
+ # The hook should exit with non-zero status after issuing an
7
+ # appropriate message if it wants to stop the commit. The hook is
8
+ # allowed to edit the commit message file.
9
+ #
10
+ # To enable this hook, rename this file to "applypatch-msg".
11
+
12
+ . git-sh-setup
13
+ test -x "$GIT_DIR/hooks/commit-msg" &&
14
+ exec "$GIT_DIR/hooks/commit-msg" ${1+"$@"}
15
+ :
@@ -0,0 +1,24 @@
1
+ #!/bin/sh
2
+ #
3
+ # An example hook script to check the commit log message.
4
+ # Called by "git commit" with one argument, the name of the file
5
+ # that has the commit message. The hook should exit with non-zero
6
+ # status after issuing an appropriate message if it wants to stop the
7
+ # commit. The hook is allowed to edit the commit message file.
8
+ #
9
+ # To enable this hook, rename this file to "commit-msg".
10
+
11
+ # Uncomment the below to add a Signed-off-by line to the message.
12
+ # Doing this in a hook is a bad idea in general, but the prepare-commit-msg
13
+ # hook is more suited to it.
14
+ #
15
+ # SOB=$(git var GIT_AUTHOR_IDENT | sed -n 's/^\(.*>\).*$/Signed-off-by: \1/p')
16
+ # grep -qs "^$SOB" "$1" || echo "$SOB" >> "$1"
17
+
18
+ # This example catches duplicate Signed-off-by lines.
19
+
20
+ test "" = "$(grep '^Signed-off-by: ' "$1" |
21
+ sort | uniq -c | sed -e '/^[ ]*1[ ]/d')" || {
22
+ echo >&2 Duplicate Signed-off-by lines.
23
+ exit 1
24
+ }
@@ -0,0 +1,8 @@
1
+ #!/bin/sh
2
+ #
3
+ # An example hook script that is called after a successful
4
+ # commit is made.
5
+ #
6
+ # To enable this hook, rename this file to "post-commit".
7
+
8
+ : Nothing
@@ -0,0 +1,15 @@
1
+ #!/bin/sh
2
+ #
3
+ # An example hook script for the "post-receive" event.
4
+ #
5
+ # The "post-receive" script is run after receive-pack has accepted a pack
6
+ # and the repository has been updated. It is passed arguments in through
7
+ # stdin in the form
8
+ # <oldrev> <newrev> <refname>
9
+ # For example:
10
+ # aa453216d1b3e49e7f6f98441fa56946ddcd6a20 68f7abf4e6f922807889f52bc043ecd31b79f814 refs/heads/master
11
+ #
12
+ # see contrib/hooks/ for a sample, or uncomment the next line and
13
+ # rename the file to "post-receive".
14
+
15
+ #. /usr/share/doc/git-core/contrib/hooks/post-receive-email
@@ -0,0 +1,8 @@
1
+ #!/bin/sh
2
+ #
3
+ # An example hook script to prepare a packed repository for use over
4
+ # dumb transports.
5
+ #
6
+ # To enable this hook, rename this file to "post-update".
7
+
8
+ exec git update-server-info
@@ -0,0 +1,14 @@
1
+ #!/bin/sh
2
+ #
3
+ # An example hook script to verify what is about to be committed
4
+ # by applypatch from an e-mail message.
5
+ #
6
+ # The hook should exit with non-zero status after issuing an
7
+ # appropriate message if it wants to stop the commit.
8
+ #
9
+ # To enable this hook, rename this file to "pre-applypatch".
10
+
11
+ . git-sh-setup
12
+ test -x "$GIT_DIR/hooks/pre-commit" &&
13
+ exec "$GIT_DIR/hooks/pre-commit" ${1+"$@"}
14
+ :
@@ -0,0 +1,46 @@
1
+ #!/bin/sh
2
+ #
3
+ # An example hook script to verify what is about to be committed.
4
+ # Called by "git commit" with no arguments. The hook should
5
+ # exit with non-zero status after issuing an appropriate message if
6
+ # it wants to stop the commit.
7
+ #
8
+ # To enable this hook, rename this file to "pre-commit".
9
+
10
+ if git rev-parse --verify HEAD >/dev/null 2>&1
11
+ then
12
+ against=HEAD
13
+ else
14
+ # Initial commit: diff against an empty tree object
15
+ against=4b825dc642cb6eb9a060e54bf8d69288fbee4904
16
+ fi
17
+
18
+ # If you want to allow non-ascii filenames set this variable to true.
19
+ allownonascii=$(git config hooks.allownonascii)
20
+
21
+ # Cross platform projects tend to avoid non-ascii filenames; prevent
22
+ # them from being added to the repository. We exploit the fact that the
23
+ # printable range starts at the space character and ends with tilde.
24
+ if [ "$allownonascii" != "true" ] &&
25
+ # Note that the use of brackets around a tr range is ok here, (it's
26
+ # even required, for portability to Solaris 10's /usr/bin/tr), since
27
+ # the square bracket bytes happen to fall in the designated range.
28
+ test "$(git diff --cached --name-only --diff-filter=A -z $against |
29
+ LC_ALL=C tr -d '[ -~]\0')"
30
+ then
31
+ echo "Error: Attempt to add a non-ascii file name."
32
+ echo
33
+ echo "This can cause problems if you want to work"
34
+ echo "with people on other platforms."
35
+ echo
36
+ echo "To be portable it is advisable to rename the file ..."
37
+ echo
38
+ echo "If you know what you are doing you can disable this"
39
+ echo "check using:"
40
+ echo
41
+ echo " git config hooks.allownonascii true"
42
+ echo
43
+ exit 1
44
+ fi
45
+
46
+ exec git diff-index --check --cached $against --
@@ -0,0 +1,172 @@
1
+ #!/bin/sh
2
+ #
3
+ # Copyright (c) 2006, 2008 Junio C Hamano
4
+ #
5
+ # The "pre-rebase" hook is run just before "git rebase" starts doing
6
+ # its job, and can prevent the command from running by exiting with
7
+ # non-zero status.
8
+ #
9
+ # The hook is called with the following parameters:
10
+ #
11
+ # $1 -- the upstream the series was forked from.
12
+ # $2 -- the branch being rebased (or empty when rebasing the current branch).
13
+ #
14
+ # This sample shows how to prevent topic branches that are already
15
+ # merged to 'next' branch from getting rebased, because allowing it
16
+ # would result in rebasing already published history.
17
+
18
+ publish=next
19
+ basebranch="$1"
20
+ if test "$#" = 2
21
+ then
22
+ topic="refs/heads/$2"
23
+ else
24
+ topic=`git symbolic-ref HEAD` ||
25
+ exit 0 ;# we do not interrupt rebasing detached HEAD
26
+ fi
27
+
28
+ case "$topic" in
29
+ refs/heads/??/*)
30
+ ;;
31
+ *)
32
+ exit 0 ;# we do not interrupt others.
33
+ ;;
34
+ esac
35
+
36
+ # Now we are dealing with a topic branch being rebased
37
+ # on top of master. Is it OK to rebase it?
38
+
39
+ # Does the topic really exist?
40
+ git show-ref -q "$topic" || {
41
+ echo >&2 "No such branch $topic"
42
+ exit 1
43
+ }
44
+
45
+ # Is topic fully merged to master?
46
+ not_in_master=`git rev-list --pretty=oneline ^master "$topic"`
47
+ if test -z "$not_in_master"
48
+ then
49
+ echo >&2 "$topic is fully merged to master; better remove it."
50
+ exit 1 ;# we could allow it, but there is no point.
51
+ fi
52
+
53
+ # Is topic ever merged to next? If so you should not be rebasing it.
54
+ only_next_1=`git rev-list ^master "^$topic" ${publish} | sort`
55
+ only_next_2=`git rev-list ^master ${publish} | sort`
56
+ if test "$only_next_1" = "$only_next_2"
57
+ then
58
+ not_in_topic=`git rev-list "^$topic" master`
59
+ if test -z "$not_in_topic"
60
+ then
61
+ echo >&2 "$topic is already up-to-date with master"
62
+ exit 1 ;# we could allow it, but there is no point.
63
+ else
64
+ exit 0
65
+ fi
66
+ else
67
+ not_in_next=`git rev-list --pretty=oneline ^${publish} "$topic"`
68
+ /usr/bin/perl -e '
69
+ my $topic = $ARGV[0];
70
+ my $msg = "* $topic has commits already merged to public branch:\n";
71
+ my (%not_in_next) = map {
72
+ /^([0-9a-f]+) /;
73
+ ($1 => 1);
74
+ } split(/\n/, $ARGV[1]);
75
+ for my $elem (map {
76
+ /^([0-9a-f]+) (.*)$/;
77
+ [$1 => $2];
78
+ } split(/\n/, $ARGV[2])) {
79
+ if (!exists $not_in_next{$elem->[0]}) {
80
+ if ($msg) {
81
+ print STDERR $msg;
82
+ undef $msg;
83
+ }
84
+ print STDERR " $elem->[1]\n";
85
+ }
86
+ }
87
+ ' "$topic" "$not_in_next" "$not_in_master"
88
+ exit 1
89
+ fi
90
+
91
+ exit 0
92
+
93
+ <<\DOC_END
94
+ ################################################################
95
+
96
+ This sample hook safeguards topic branches that have been
97
+ published from being rewound.
98
+
99
+ The workflow assumed here is:
100
+
101
+ * Once a topic branch forks from "master", "master" is never
102
+ merged into it again (either directly or indirectly).
103
+
104
+ * Once a topic branch is fully cooked and merged into "master",
105
+ it is deleted. If you need to build on top of it to correct
106
+ earlier mistakes, a new topic branch is created by forking at
107
+ the tip of the "master". This is not strictly necessary, but
108
+ it makes it easier to keep your history simple.
109
+
110
+ * Whenever you need to test or publish your changes to topic
111
+ branches, merge them into "next" branch.
112
+
113
+ The script, being an example, hardcodes the publish branch name
114
+ to be "next", but it is trivial to make it configurable via
115
+ $GIT_DIR/config mechanism.
116
+
117
+ With this workflow, you would want to know:
118
+
119
+ (1) ... if a topic branch has ever been merged to "next". Young
120
+ topic branches can have stupid mistakes you would rather
121
+ clean up before publishing, and things that have not been
122
+ merged into other branches can be easily rebased without
123
+ affecting other people. But once it is published, you would
124
+ not want to rewind it.
125
+
126
+ (2) ... if a topic branch has been fully merged to "master".
127
+ Then you can delete it. More importantly, you should not
128
+ build on top of it -- other people may already want to
129
+ change things related to the topic as patches against your
130
+ "master", so if you need further changes, it is better to
131
+ fork the topic (perhaps with the same name) afresh from the
132
+ tip of "master".
133
+
134
+ Let's look at this example:
135
+
136
+ o---o---o---o---o---o---o---o---o---o "next"
137
+ / / / /
138
+ / a---a---b A / /
139
+ / / / /
140
+ / / c---c---c---c B /
141
+ / / / \ /
142
+ / / / b---b C \ /
143
+ / / / / \ /
144
+ ---o---o---o---o---o---o---o---o---o---o---o "master"
145
+
146
+
147
+ A, B and C are topic branches.
148
+
149
+ * A has one fix since it was merged up to "next".
150
+
151
+ * B has finished. It has been fully merged up to "master" and "next",
152
+ and is ready to be deleted.
153
+
154
+ * C has not merged to "next" at all.
155
+
156
+ We would want to allow C to be rebased, refuse A, and encourage
157
+ B to be deleted.
158
+
159
+ To compute (1):
160
+
161
+ git rev-list ^master ^topic next
162
+ git rev-list ^master next
163
+
164
+ if these match, topic has not merged in next at all.
165
+
166
+ To compute (2):
167
+
168
+ git rev-list master..topic
169
+
170
+ if this is empty, it is fully merged to "master".
171
+
172
+ DOC_END
@@ -0,0 +1,36 @@
1
+ #!/bin/sh
2
+ #
3
+ # An example hook script to prepare the commit log message.
4
+ # Called by "git commit" with the name of the file that has the
5
+ # commit message, followed by the description of the commit
6
+ # message's source. The hook's purpose is to edit the commit
7
+ # message file. If the hook fails with a non-zero status,
8
+ # the commit is aborted.
9
+ #
10
+ # To enable this hook, rename this file to "prepare-commit-msg".
11
+
12
+ # This hook includes three examples. The first comments out the
13
+ # "Conflicts:" part of a merge commit.
14
+ #
15
+ # The second includes the output of "git diff --name-status -r"
16
+ # into the message, just before the "git status" output. It is
17
+ # commented because it doesn't cope with --amend or with squashed
18
+ # commits.
19
+ #
20
+ # The third example adds a Signed-off-by line to the message, that can
21
+ # still be edited. This is rarely a good idea.
22
+
23
+ case "$2,$3" in
24
+ merge,)
25
+ /usr/bin/perl -i.bak -ne 's/^/# /, s/^# #/#/ if /^Conflicts/ .. /#/; print' "$1" ;;
26
+
27
+ # ,|template,)
28
+ # /usr/bin/perl -i.bak -pe '
29
+ # print "\n" . `git diff --cached --name-status -r`
30
+ # if /^#/ && $first++ == 0' "$1" ;;
31
+
32
+ *) ;;
33
+ esac
34
+
35
+ # SOB=$(git var GIT_AUTHOR_IDENT | sed -n 's/^\(.*>\).*$/Signed-off-by: \1/p')
36
+ # grep -qs "^$SOB" "$1" || echo "$SOB" >> "$1"
@@ -0,0 +1,128 @@
1
+ #!/bin/sh
2
+ #
3
+ # An example hook script to blocks unannotated tags from entering.
4
+ # Called by "git receive-pack" with arguments: refname sha1-old sha1-new
5
+ #
6
+ # To enable this hook, rename this file to "update".
7
+ #
8
+ # Config
9
+ # ------
10
+ # hooks.allowunannotated
11
+ # This boolean sets whether unannotated tags will be allowed into the
12
+ # repository. By default they won't be.
13
+ # hooks.allowdeletetag
14
+ # This boolean sets whether deleting tags will be allowed in the
15
+ # repository. By default they won't be.
16
+ # hooks.allowmodifytag
17
+ # This boolean sets whether a tag may be modified after creation. By default
18
+ # it won't be.
19
+ # hooks.allowdeletebranch
20
+ # This boolean sets whether deleting branches will be allowed in the
21
+ # repository. By default they won't be.
22
+ # hooks.denycreatebranch
23
+ # This boolean sets whether remotely creating branches will be denied
24
+ # in the repository. By default this is allowed.
25
+ #
26
+
27
+ # --- Command line
28
+ refname="$1"
29
+ oldrev="$2"
30
+ newrev="$3"
31
+
32
+ # --- Safety check
33
+ if [ -z "$GIT_DIR" ]; then
34
+ echo "Don't run this script from the command line." >&2
35
+ echo " (if you want, you could supply GIT_DIR then run" >&2
36
+ echo " $0 <ref> <oldrev> <newrev>)" >&2
37
+ exit 1
38
+ fi
39
+
40
+ if [ -z "$refname" -o -z "$oldrev" -o -z "$newrev" ]; then
41
+ echo "Usage: $0 <ref> <oldrev> <newrev>" >&2
42
+ exit 1
43
+ fi
44
+
45
+ # --- Config
46
+ allowunannotated=$(git config --bool hooks.allowunannotated)
47
+ allowdeletebranch=$(git config --bool hooks.allowdeletebranch)
48
+ denycreatebranch=$(git config --bool hooks.denycreatebranch)
49
+ allowdeletetag=$(git config --bool hooks.allowdeletetag)
50
+ allowmodifytag=$(git config --bool hooks.allowmodifytag)
51
+
52
+ # check for no description
53
+ projectdesc=$(sed -e '1q' "$GIT_DIR/description")
54
+ case "$projectdesc" in
55
+ "Unnamed repository"* | "")
56
+ echo "*** Project description file hasn't been set" >&2
57
+ exit 1
58
+ ;;
59
+ esac
60
+
61
+ # --- Check types
62
+ # if $newrev is 0000...0000, it's a commit to delete a ref.
63
+ zero="0000000000000000000000000000000000000000"
64
+ if [ "$newrev" = "$zero" ]; then
65
+ newrev_type=delete
66
+ else
67
+ newrev_type=$(git cat-file -t $newrev)
68
+ fi
69
+
70
+ case "$refname","$newrev_type" in
71
+ refs/tags/*,commit)
72
+ # un-annotated tag
73
+ short_refname=${refname##refs/tags/}
74
+ if [ "$allowunannotated" != "true" ]; then
75
+ echo "*** The un-annotated tag, $short_refname, is not allowed in this repository" >&2
76
+ echo "*** Use 'git tag [ -a | -s ]' for tags you want to propagate." >&2
77
+ exit 1
78
+ fi
79
+ ;;
80
+ refs/tags/*,delete)
81
+ # delete tag
82
+ if [ "$allowdeletetag" != "true" ]; then
83
+ echo "*** Deleting a tag is not allowed in this repository" >&2
84
+ exit 1
85
+ fi
86
+ ;;
87
+ refs/tags/*,tag)
88
+ # annotated tag
89
+ if [ "$allowmodifytag" != "true" ] && git rev-parse $refname > /dev/null 2>&1
90
+ then
91
+ echo "*** Tag '$refname' already exists." >&2
92
+ echo "*** Modifying a tag is not allowed in this repository." >&2
93
+ exit 1
94
+ fi
95
+ ;;
96
+ refs/heads/*,commit)
97
+ # branch
98
+ if [ "$oldrev" = "$zero" -a "$denycreatebranch" = "true" ]; then
99
+ echo "*** Creating a branch is not allowed in this repository" >&2
100
+ exit 1
101
+ fi
102
+ ;;
103
+ refs/heads/*,delete)
104
+ # delete branch
105
+ if [ "$allowdeletebranch" != "true" ]; then
106
+ echo "*** Deleting a branch is not allowed in this repository" >&2
107
+ exit 1
108
+ fi
109
+ ;;
110
+ refs/remotes/*,commit)
111
+ # tracking branch
112
+ ;;
113
+ refs/remotes/*,delete)
114
+ # delete tracking branch
115
+ if [ "$allowdeletebranch" != "true" ]; then
116
+ echo "*** Deleting a tracking branch is not allowed in this repository" >&2
117
+ exit 1
118
+ fi
119
+ ;;
120
+ *)
121
+ # Anything else (is there anything else?)
122
+ echo "*** Update hook: unknown type of update to ref $refname of type $newrev_type" >&2
123
+ exit 1
124
+ ;;
125
+ esac
126
+
127
+ # --- Finished
128
+ exit 0
Binary file
@@ -0,0 +1,6 @@
1
+ # git ls-files --others --exclude-from=.git/info/exclude
2
+ # Lines that start with '#' are comments.
3
+ # For a project mostly in C, the following would be a good set of
4
+ # exclude patterns (uncomment them if you want to use them):
5
+ # *.[oa]
6
+ # *~
@@ -0,0 +1,5 @@
1
+ 94e162b505bc2290fb67764357a625192f8a4e8a refs/bisect/bad
2
+ bfb16eec1081387b586dc8009ef422cfff60b622 refs/bisect/good-bfb16eec1081387b586dc8009ef422cfff60b622
3
+ c0a1cdff8dd63948a5fc41f5871681c5b133c053 refs/bisect/good-c0a1cdff8dd63948a5fc41f5871681c5b133c053
4
+ f608824888b83bbedc1f658be7496ffea467a8fb refs/bisect/good-f608824888b83bbedc1f658be7496ffea467a8fb
5
+ f351ca63a759f56bb26924fd566294eb23455c71 refs/heads/master
@@ -0,0 +1,25 @@
1
+ 0000000000000000000000000000000000000000 b066349076e2b71e3b71cfeb1ba88af99cc036f6 Robert Bittle <guywithnose@gmail.com> 1335144302 -0400 commit (initial): First commit
2
+ b066349076e2b71e3b71cfeb1ba88af99cc036f6 15c915b17ee502c80df64aff04da024c17ac9da0 Robert Bittle <guywithnose@gmail.com> 1335144302 -0400 commit: Bad commit
3
+ 15c915b17ee502c80df64aff04da024c17ac9da0 d9882afd25595d7d6dc8ead68c68e4f00c94c9b2 Robert Bittle <guywithnose@gmail.com> 1335144302 -0400 commit: Second commit
4
+ d9882afd25595d7d6dc8ead68c68e4f00c94c9b2 b066349076e2b71e3b71cfeb1ba88af99cc036f6 Robert Bittle <guywithnose@gmail.com> 1335144309 -0400 checkout: moving from master to b066349076e2b71e3b71cfeb1ba88af99cc036f6
5
+ b066349076e2b71e3b71cfeb1ba88af99cc036f6 bed2d266fa44b56968a17f1e2d409b306032bd6d Robert Bittle <guywithnose@gmail.com> 1335144309 -0400 rebase -i (pick): Second commit
6
+ bed2d266fa44b56968a17f1e2d409b306032bd6d b066349076e2b71e3b71cfeb1ba88af99cc036f6 Robert Bittle <guywithnose@gmail.com> 1335175555 -0400 HEAD~1: updating HEAD
7
+ b066349076e2b71e3b71cfeb1ba88af99cc036f6 f608824888b83bbedc1f658be7496ffea467a8fb Robert Bittle <guywithnose@gmail.com> 1335177947 -0400 commit (amend): First commit
8
+ f608824888b83bbedc1f658be7496ffea467a8fb d406b1b8bc269c9aef9127299e83947220e7a9b0 Robert Bittle <guywithnose@gmail.com> 1335178003 -0400 commit: Another Commit
9
+ d406b1b8bc269c9aef9127299e83947220e7a9b0 0b194f30d6867522d1666590087e6c0b5e20dc93 Robert Bittle <guywithnose@gmail.com> 1335178095 -0400 commit: Another Commit
10
+ 0b194f30d6867522d1666590087e6c0b5e20dc93 98d617d3bdf0b6c59d6177233acb4b9fd54b7aac Robert Bittle <guywithnose@gmail.com> 1335178214 -0400 commit: Another Commit
11
+ 98d617d3bdf0b6c59d6177233acb4b9fd54b7aac 89d27c5f4680cd21028947be75c33a68511decb9 Robert Bittle <guywithnose@gmail.com> 1335178242 -0400 commit: Another Commit
12
+ 89d27c5f4680cd21028947be75c33a68511decb9 e8dd08d5aabb62b56c80320672cd8d42e2b8954d Robert Bittle <guywithnose@gmail.com> 1335178263 -0400 commit: Another Commit
13
+ e8dd08d5aabb62b56c80320672cd8d42e2b8954d c0a1cdff8dd63948a5fc41f5871681c5b133c053 Robert Bittle <guywithnose@gmail.com> 1335178286 -0400 commit: Another Commit
14
+ c0a1cdff8dd63948a5fc41f5871681c5b133c053 bfb16eec1081387b586dc8009ef422cfff60b622 Robert Bittle <guywithnose@gmail.com> 1335178306 -0400 commit: Another Commit
15
+ bfb16eec1081387b586dc8009ef422cfff60b622 94e162b505bc2290fb67764357a625192f8a4e8a Robert Bittle <guywithnose@gmail.com> 1335178330 -0400 commit: Another Commit
16
+ 94e162b505bc2290fb67764357a625192f8a4e8a 4145057e11ab90109c95882b1f40d560da408bfa Robert Bittle <guywithnose@gmail.com> 1335178341 -0400 commit: Another Commit
17
+ 4145057e11ab90109c95882b1f40d560da408bfa c1b80f5ed4995cda8e19027f0776351af6b76703 Robert Bittle <guywithnose@gmail.com> 1335178357 -0400 commit: Another Commit
18
+ c1b80f5ed4995cda8e19027f0776351af6b76703 36da01fb0571360b0e1170f0cb46e74f72927cda Robert Bittle <guywithnose@gmail.com> 1335178376 -0400 commit: Another Commit
19
+ 36da01fb0571360b0e1170f0cb46e74f72927cda 7f8406e742c5281ec2c9bc3c6cc69dc6ba5311fd Robert Bittle <guywithnose@gmail.com> 1335178390 -0400 commit: Another Commit
20
+ 7f8406e742c5281ec2c9bc3c6cc69dc6ba5311fd f351ca63a759f56bb26924fd566294eb23455c71 Robert Bittle <guywithnose@gmail.com> 1335178407 -0400 commit: Another Commit
21
+ f351ca63a759f56bb26924fd566294eb23455c71 c0a1cdff8dd63948a5fc41f5871681c5b133c053 Robert Bittle <guywithnose@gmail.com> 1335178499 -0400 checkout: moving from master to c0a1cdff8dd63948a5fc41f5871681c5b133c053
22
+ c0a1cdff8dd63948a5fc41f5871681c5b133c053 4145057e11ab90109c95882b1f40d560da408bfa Robert Bittle <guywithnose@gmail.com> 1335178506 -0400 checkout: moving from c0a1cdff8dd63948a5fc41f5871681c5b133c053 to 4145057e11ab90109c95882b1f40d560da408bfa
23
+ 4145057e11ab90109c95882b1f40d560da408bfa 94e162b505bc2290fb67764357a625192f8a4e8a Robert Bittle <guywithnose@gmail.com> 1335178506 -0400 checkout: moving from 4145057e11ab90109c95882b1f40d560da408bfa to 94e162b505bc2290fb67764357a625192f8a4e8a
24
+ 94e162b505bc2290fb67764357a625192f8a4e8a bfb16eec1081387b586dc8009ef422cfff60b622 Robert Bittle <guywithnose@gmail.com> 1335178506 -0400 checkout: moving from 94e162b505bc2290fb67764357a625192f8a4e8a to bfb16eec1081387b586dc8009ef422cfff60b622
25
+ bfb16eec1081387b586dc8009ef422cfff60b622 f351ca63a759f56bb26924fd566294eb23455c71 Robert Bittle <guywithnose@gmail.com> 1335182458 -0400 reset: moving to master
@@ -0,0 +1,19 @@
1
+ 0000000000000000000000000000000000000000 b066349076e2b71e3b71cfeb1ba88af99cc036f6 Robert Bittle <guywithnose@gmail.com> 1335144302 -0400 commit (initial): First commit
2
+ b066349076e2b71e3b71cfeb1ba88af99cc036f6 15c915b17ee502c80df64aff04da024c17ac9da0 Robert Bittle <guywithnose@gmail.com> 1335144302 -0400 commit: Bad commit
3
+ 15c915b17ee502c80df64aff04da024c17ac9da0 d9882afd25595d7d6dc8ead68c68e4f00c94c9b2 Robert Bittle <guywithnose@gmail.com> 1335144302 -0400 commit: Second commit
4
+ d9882afd25595d7d6dc8ead68c68e4f00c94c9b2 bed2d266fa44b56968a17f1e2d409b306032bd6d Robert Bittle <guywithnose@gmail.com> 1335144309 -0400 rebase -i (finish): refs/heads/master onto b066349
5
+ bed2d266fa44b56968a17f1e2d409b306032bd6d b066349076e2b71e3b71cfeb1ba88af99cc036f6 Robert Bittle <guywithnose@gmail.com> 1335175555 -0400 HEAD~1: updating HEAD
6
+ b066349076e2b71e3b71cfeb1ba88af99cc036f6 f608824888b83bbedc1f658be7496ffea467a8fb Robert Bittle <guywithnose@gmail.com> 1335177947 -0400 commit (amend): First commit
7
+ f608824888b83bbedc1f658be7496ffea467a8fb d406b1b8bc269c9aef9127299e83947220e7a9b0 Robert Bittle <guywithnose@gmail.com> 1335178003 -0400 commit: Another Commit
8
+ d406b1b8bc269c9aef9127299e83947220e7a9b0 0b194f30d6867522d1666590087e6c0b5e20dc93 Robert Bittle <guywithnose@gmail.com> 1335178095 -0400 commit: Another Commit
9
+ 0b194f30d6867522d1666590087e6c0b5e20dc93 98d617d3bdf0b6c59d6177233acb4b9fd54b7aac Robert Bittle <guywithnose@gmail.com> 1335178214 -0400 commit: Another Commit
10
+ 98d617d3bdf0b6c59d6177233acb4b9fd54b7aac 89d27c5f4680cd21028947be75c33a68511decb9 Robert Bittle <guywithnose@gmail.com> 1335178242 -0400 commit: Another Commit
11
+ 89d27c5f4680cd21028947be75c33a68511decb9 e8dd08d5aabb62b56c80320672cd8d42e2b8954d Robert Bittle <guywithnose@gmail.com> 1335178263 -0400 commit: Another Commit
12
+ e8dd08d5aabb62b56c80320672cd8d42e2b8954d c0a1cdff8dd63948a5fc41f5871681c5b133c053 Robert Bittle <guywithnose@gmail.com> 1335178286 -0400 commit: Another Commit
13
+ c0a1cdff8dd63948a5fc41f5871681c5b133c053 bfb16eec1081387b586dc8009ef422cfff60b622 Robert Bittle <guywithnose@gmail.com> 1335178306 -0400 commit: Another Commit
14
+ bfb16eec1081387b586dc8009ef422cfff60b622 94e162b505bc2290fb67764357a625192f8a4e8a Robert Bittle <guywithnose@gmail.com> 1335178330 -0400 commit: Another Commit
15
+ 94e162b505bc2290fb67764357a625192f8a4e8a 4145057e11ab90109c95882b1f40d560da408bfa Robert Bittle <guywithnose@gmail.com> 1335178341 -0400 commit: Another Commit
16
+ 4145057e11ab90109c95882b1f40d560da408bfa c1b80f5ed4995cda8e19027f0776351af6b76703 Robert Bittle <guywithnose@gmail.com> 1335178357 -0400 commit: Another Commit
17
+ c1b80f5ed4995cda8e19027f0776351af6b76703 36da01fb0571360b0e1170f0cb46e74f72927cda Robert Bittle <guywithnose@gmail.com> 1335178376 -0400 commit: Another Commit
18
+ 36da01fb0571360b0e1170f0cb46e74f72927cda 7f8406e742c5281ec2c9bc3c6cc69dc6ba5311fd Robert Bittle <guywithnose@gmail.com> 1335178390 -0400 commit: Another Commit
19
+ 7f8406e742c5281ec2c9bc3c6cc69dc6ba5311fd f351ca63a759f56bb26924fd566294eb23455c71 Robert Bittle <guywithnose@gmail.com> 1335178407 -0400 commit: Another Commit
@@ -0,0 +1,2 @@
1
+ P pack-34f18db272b06cca4ff6cbbdbc96d496f6b28995.pack
2
+
@@ -0,0 +1,6 @@
1
+ # pack-refs with: peeled
2
+ 94e162b505bc2290fb67764357a625192f8a4e8a refs/bisect/bad
3
+ bfb16eec1081387b586dc8009ef422cfff60b622 refs/bisect/good-bfb16eec1081387b586dc8009ef422cfff60b622
4
+ c0a1cdff8dd63948a5fc41f5871681c5b133c053 refs/bisect/good-c0a1cdff8dd63948a5fc41f5871681c5b133c053
5
+ f608824888b83bbedc1f658be7496ffea467a8fb refs/bisect/good-f608824888b83bbedc1f658be7496ffea467a8fb
6
+ f351ca63a759f56bb26924fd566294eb23455c71 refs/heads/master
@@ -0,0 +1,2 @@
1
+ test:
2
+ ruby prog.rb 5 | ruby test.rb
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ puts Integer((Integer(ARGV[0])-3)*9)-1
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ line = gets
4
+ exit 1 if line != "15\n"
@@ -3,6 +3,7 @@ description "Your new feature isn't worth the time and you're going to delete it
3
3
 
4
4
  setup do
5
5
  init_from_level
6
+ `git stash` #fix for README.md being in githug root an the level
6
7
  end
7
8
 
8
9
  solution do
File without changes
File without changes
File without changes
File without changes
File without changes
Binary file
data/levels/init.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  difficulty 1
2
- description "Initialize an empty repository"
2
+ description "A new directory, git_hug, has been created; initialize an empty repository in it"
3
3
 
4
4
  solution do
5
5
  repo.valid?
@@ -9,7 +9,7 @@ setup do
9
9
 
10
10
  FileUtils.touch "file1"
11
11
  repo.add "file1"
12
- repo.commit_all "First commmit"
12
+ repo.commit_all "First coommit"
13
13
 
14
14
  FileUtils.touch "file2"
15
15
  repo.add "file2"
data/levels/restore.rb ADDED
@@ -0,0 +1,28 @@
1
+ difficulty 4
2
+ description "You decided to delete your latest commit by running `git checkout HEAD^`. (Not a smart thing to do.) You then change your mind, and want that commit back. Restore the deleted commit."
3
+
4
+ setup do
5
+ repo.init
6
+ FileUtils.touch 'file1'
7
+ repo.add 'file1'
8
+ repo.commit_all 'Initial commit'
9
+
10
+ FileUtils.touch 'file2'
11
+ repo.add 'file2'
12
+ repo.commit_all 'First commit'
13
+
14
+ FileUtils.touch 'file3'
15
+ repo.add 'file3'
16
+ repo.commit_all 'Restore this commit'
17
+
18
+ repo.git.native :checkout, {}, 'HEAD^'
19
+ end
20
+
21
+ solution do
22
+ return false unless File.exists?('file3')
23
+ true
24
+ end
25
+
26
+ hint do
27
+ puts "The commit is still floating around somewhere. Have you checked out `git reflog`?"
28
+ end
data/lib/githug/level.rb CHANGED
@@ -8,7 +8,8 @@ module Githug
8
8
  "checkout_file", "remote", "remote_url", "pull", "remote_add",
9
9
  "diff", "blame", "branch", "checkout", "branch_at", "merge",
10
10
  "cherry-pick", "rename_commit", "squash", "merge_squash", "reorder",
11
- "stage_lines", "find_old_branch", "revert", "contribute"]
11
+ "bisect", "stage_lines", "find_old_branch", "revert", "restore",
12
+ "contribute"]
12
13
 
13
14
  attr_accessor :level_no, :level_path
14
15
 
@@ -22,12 +22,8 @@ module Githug
22
22
  !@grit.nil?
23
23
  end
24
24
 
25
- def init(gitignore = true)
25
+ def init(*args)
26
26
  @grit = Grit::Repo.init(".")
27
- if gitignore
28
- @grit.add(".gitignore")
29
- @grit.commit_all("added .gitignore")
30
- end
31
27
  end
32
28
 
33
29
  def method_missing(method, *args, &block)
@@ -1,3 +1,3 @@
1
1
  module Githug
2
- VERSION = "0.2.4"
2
+ VERSION = "0.2.5"
3
3
  end
@@ -62,21 +62,9 @@ describe Githug::Repository do
62
62
  end
63
63
 
64
64
  describe "init" do
65
- before(:each) do
65
+ it "should not add and commit gitignore if prompted" do
66
66
  @repo = mock
67
67
  Grit::Repo.should_receive(:init).with(".").and_return(@repo)
68
- end
69
-
70
- it "should initialize an empty repository and add .gitignore" do
71
- @repo.should_receive(:add).with(".gitignore")
72
- @repo.should_receive(:commit_all).with("added .gitignore")
73
- @repository.init
74
- end
75
-
76
- it "should not add and commit gitignore if prompted" do
77
- @repo.should_not_receive(:add).with(".gitignore")
78
- @repo.should_not_receive(:add).with(".profile.yml")
79
- @repo.should_not_receive(:commit).with("added .gitignore")
80
68
  @repository.init(false)
81
69
  end
82
70
  end
metadata CHANGED
@@ -1,68 +1,71 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: githug
3
- version: !ruby/object:Gem::Version
4
- version: 0.2.4
3
+ version: !ruby/object:Gem::Version
5
4
  prerelease:
5
+ version: 0.2.5
6
6
  platform: ruby
7
- authors:
7
+ authors:
8
8
  - Gary Rennie
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-04-23 00:00:00.000000000Z
13
- dependencies:
14
- - !ruby/object:Gem::Dependency
12
+
13
+ date: 2012-07-03 00:00:00 Z
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
15
16
  name: rspec
16
- requirement: &12289920 !ruby/object:Gem::Requirement
17
+ prerelease: false
18
+ requirement: &id001 !ruby/object:Gem::Requirement
17
19
  none: false
18
- requirements:
20
+ requirements:
19
21
  - - ~>
20
- - !ruby/object:Gem::Version
22
+ - !ruby/object:Gem::Version
21
23
  version: 2.8.0
22
24
  type: :development
23
- prerelease: false
24
- version_requirements: *12289920
25
- - !ruby/object:Gem::Dependency
25
+ version_requirements: *id001
26
+ - !ruby/object:Gem::Dependency
26
27
  name: grit
27
- requirement: &12276660 !ruby/object:Gem::Requirement
28
+ prerelease: false
29
+ requirement: &id002 !ruby/object:Gem::Requirement
28
30
  none: false
29
- requirements:
31
+ requirements:
30
32
  - - ~>
31
- - !ruby/object:Gem::Version
33
+ - !ruby/object:Gem::Version
32
34
  version: 2.3.0
33
35
  type: :runtime
34
- prerelease: false
35
- version_requirements: *12276660
36
- - !ruby/object:Gem::Dependency
36
+ version_requirements: *id002
37
+ - !ruby/object:Gem::Dependency
37
38
  name: thor
38
- requirement: &12275640 !ruby/object:Gem::Requirement
39
+ prerelease: false
40
+ requirement: &id003 !ruby/object:Gem::Requirement
39
41
  none: false
40
- requirements:
42
+ requirements:
41
43
  - - ~>
42
- - !ruby/object:Gem::Version
44
+ - !ruby/object:Gem::Version
43
45
  version: 0.14.6
44
46
  type: :runtime
45
- prerelease: false
46
- version_requirements: *12275640
47
- - !ruby/object:Gem::Dependency
47
+ version_requirements: *id003
48
+ - !ruby/object:Gem::Dependency
48
49
  name: rake
49
- requirement: &12275220 !ruby/object:Gem::Requirement
50
+ prerelease: false
51
+ requirement: &id004 !ruby/object:Gem::Requirement
50
52
  none: false
51
- requirements:
52
- - - ! '>='
53
- - !ruby/object:Gem::Version
54
- version: '0'
53
+ requirements:
54
+ - - ">="
55
+ - !ruby/object:Gem::Version
56
+ version: "0"
55
57
  type: :runtime
56
- prerelease: false
57
- version_requirements: *12275220
58
+ version_requirements: *id004
58
59
  description: An interactive way to learn git.
59
- email:
60
+ email:
60
61
  - webmaster@gazler.com
61
- executables:
62
+ executables:
62
63
  - githug
63
64
  extensions: []
65
+
64
66
  extra_rdoc_files: []
65
- files:
67
+
68
+ files:
66
69
  - .gitignore
67
70
  - .rspec
68
71
  - .travis.yml
@@ -72,6 +75,33 @@ files:
72
75
  - bin/githug
73
76
  - githug.gemspec
74
77
  - levels/add.rb
78
+ - levels/bisect.rb
79
+ - levels/bisect/.githug/HEAD
80
+ - levels/bisect/.githug/ORIG_HEAD
81
+ - levels/bisect/.githug/config
82
+ - levels/bisect/.githug/description
83
+ - levels/bisect/.githug/hooks/applypatch-msg.sample
84
+ - levels/bisect/.githug/hooks/commit-msg.sample
85
+ - levels/bisect/.githug/hooks/post-commit.sample
86
+ - levels/bisect/.githug/hooks/post-receive.sample
87
+ - levels/bisect/.githug/hooks/post-update.sample
88
+ - levels/bisect/.githug/hooks/pre-applypatch.sample
89
+ - levels/bisect/.githug/hooks/pre-commit.sample
90
+ - levels/bisect/.githug/hooks/pre-rebase.sample
91
+ - levels/bisect/.githug/hooks/prepare-commit-msg.sample
92
+ - levels/bisect/.githug/hooks/update.sample
93
+ - levels/bisect/.githug/index
94
+ - levels/bisect/.githug/info/exclude
95
+ - levels/bisect/.githug/info/refs
96
+ - levels/bisect/.githug/logs/HEAD
97
+ - levels/bisect/.githug/logs/refs/heads/master
98
+ - levels/bisect/.githug/objects/info/packs
99
+ - levels/bisect/.githug/objects/pack/pack-34f18db272b06cca4ff6cbbdbc96d496f6b28995.idx
100
+ - levels/bisect/.githug/objects/pack/pack-34f18db272b06cca4ff6cbbdbc96d496f6b28995.pack
101
+ - levels/bisect/.githug/packed-refs
102
+ - levels/bisect/makefile
103
+ - levels/bisect/prog.rb
104
+ - levels/bisect/test.rb
75
105
  - levels/blame.rb
76
106
  - levels/blame/.githug/COMMIT_EDITMSG
77
107
  - levels/blame/.githug/HEAD
@@ -268,6 +298,7 @@ files:
268
298
  - levels/rename_commit.rb
269
299
  - levels/reorder.rb
270
300
  - levels/reset.rb
301
+ - levels/restore.rb
271
302
  - levels/revert.rb
272
303
  - levels/rm.rb
273
304
  - levels/rm_cached.rb
@@ -290,28 +321,32 @@ files:
290
321
  - spec/githug/repository_spec.rb
291
322
  - spec/githug/ui_spec.rb
292
323
  - spec/spec_helper.rb
293
- homepage: ''
324
+ homepage: ""
294
325
  licenses: []
326
+
295
327
  post_install_message:
296
328
  rdoc_options: []
297
- require_paths:
329
+
330
+ require_paths:
298
331
  - lib
299
- required_ruby_version: !ruby/object:Gem::Requirement
332
+ required_ruby_version: !ruby/object:Gem::Requirement
300
333
  none: false
301
- requirements:
302
- - - ! '>='
303
- - !ruby/object:Gem::Version
304
- version: '0'
305
- required_rubygems_version: !ruby/object:Gem::Requirement
334
+ requirements:
335
+ - - ">="
336
+ - !ruby/object:Gem::Version
337
+ version: "0"
338
+ required_rubygems_version: !ruby/object:Gem::Requirement
306
339
  none: false
307
- requirements:
308
- - - ! '>='
309
- - !ruby/object:Gem::Version
310
- version: '0'
340
+ requirements:
341
+ - - ">="
342
+ - !ruby/object:Gem::Version
343
+ version: "0"
311
344
  requirements: []
345
+
312
346
  rubyforge_project: githug
313
- rubygems_version: 1.8.10
347
+ rubygems_version: 1.8.21
314
348
  signing_key:
315
349
  specification_version: 3
316
350
  summary: An interactive way to learn git.
317
351
  test_files: []
352
+