1#!/usr/bin/perl -w
2use Test::More tests => 27;
3use strict;
4use SVK::Test;
5our $output;
6my ($xd, $svk) = build_test();
7my ($copath, $corpath) = get_copath ('status');
8my ($repospath, undef, $repos) = $xd->find_repos ('//', 1);
9$svk->checkout ('//', $copath);
10chdir ($copath);
11mkdir ('A');
12mkdir ('A/deep');
13overwrite_file ("A/foo", "foobar");
14overwrite_file ("A/foo~", "foobar");
15overwrite_file ("A/bar", "foobar");
16overwrite_file ("A/deep/baz", "foobar");
17
18is_output_like ($svk, 'status', ['--help'], qr'SYNOPSIS');
19
20is_output ($svk, 'status', [],
21	   ['?   A'], 'status - unknown');
22is_output ($svk, 'status', ['-q'],
23           [],      '  -q');
24is_output ($svk, 'status', ['--quiet'],
25           [],      '  --quiet');
26
27$svk->add ('-N', 'A');
28$svk->add ('A/foo');
29is_output ($svk, 'status', [],
30	   [ map __($_), 'A   A', '?   A/bar', '?   A/deep', 'A   A/foo'], 'status - unknown');
31chdir('A');
32is_output ($svk, 'status', ['../A'],
33	   [ map __($_), 'A   ../A', '?   ../A/bar', '?   ../A/deep', 'A   ../A/foo'], 'status - unknown');
34chdir('..');
35$svk->add ('A/deep');
36$svk->commit ('-m', 'add a bunch for files');
37overwrite_file ("A/foo", "fnord");
38overwrite_file ("A/another", "fnord");
39$svk->add ('A/another');
40$svk->ps ('someprop', 'somevalue', 'A/foo', 'A/another');
41is_output ($svk, 'status', [],
42	   [ map __($_), 'MM  A/foo', 'A   A/another', '?   A/bar'], 'status - modified file and prop');
43$svk->commit ('-m', 'some modification');
44overwrite_file ("A/foo", "fnord\nmore");
45$svk->commit ('-m', 'more modification');
46rmtree (['A/deep']);
47unlink ('A/another');
48is_output ($svk, 'status', [],
49	   [ map __($_), '!   A/another', '!   A/deep', '?   A/bar'], 'status - absent file and dir');
50$svk->revert ('-R', 'A');
51unlink ('A/deep/baz');
52$svk->status;
53$svk->delete ('A/deep');
54$svk->delete ('A/another');
55is_output ($svk, 'status', [],
56	   [ map __($_), '?   A/bar', 'D   A/another', 'D   A/deep', 'D   A/deep/baz'], 'status - deleted file and dir');
57
58is_output ($svk, 'status', ['-q'],
59	   [ map __($_), 'D   A/another', 'D   A/deep', 'D   A/deep/baz'], '  -q');
60
61$svk->revert ('-R', 'A');
62overwrite_file ("A/foo", "foo");
63$svk->merge ('-r1:2', '//A', 'A');
64is_output ($svk, 'status', [],
65	   [ map __($_), 'C   A/foo', '?   A/bar'], 'status - conflict');
66$svk->resolved ('A/foo');
67$svk->revert ('-R', 'A');
68overwrite_file ("A/foo", "foo");
69$svk->merge ('-r2:3', '//A', 'A');
70is_output ($svk, 'status', [],
71	   [ map __($_), 'C   A/foo', '?   A/bar'], 'status - conflict');
72$svk->revert ('A/foo');
73$svk->ps ('someprop', 'somevalue', '.');
74$svk->ps ('someprop', 'somevalue', 'A');
75chdir ('A');
76is_output ($svk, 'status', [],
77	   [ map __($_), '?   bar', ' M  .']);
78chdir ('..');
79$svk->revert ('-R', '.');
80$svk->ps ('someprop', 'somevalue', 'A/deep/baz');
81is_output ($svk, 'status', ['A/deep'],
82	   [__(' M  A/deep/baz')], 'prop only');
83$svk->revert ('-R', '.');
84rmtree (['A/deep']);
85overwrite_file ("A/deep", "dir replaced with file.\n");
86unlink('A/another');
87mkdir('A/another');
88
89is_output ($svk, 'status', [],
90	   [map __($_),
91	    '?   A/bar',
92	    '~   A/another',
93	    '~   A/deep'], 'obstructure');
94
95is_output ($svk, 'status', [],
96	   [map __($_),
97	    '?   A/bar',
98	    '~   A/another',
99	    '~   A/deep'], 'obstructure - make sure it is not signatured');
100
101# XXX: revert should hint about moving away obstructed entries
102$svk->revert ('-R', '.');
103# fixup
104rmtree (['A/another']);
105$svk->revert ('-R', '.');
106
107is_output($svk, 'st', [], [__('?   A/bar'),
108			   __('~   A/deep')]);
109
110$svk->mkdir ('-p', '-m', ' ', '//A/deeper/deeper');
111$svk->up;
112append_file ("A/deeper/deeper/baz", "baz");
113$svk->add ("A/deeper/deeper/baz");
114$svk->rm ('-m', 'delete', '//A/deeper');
115overwrite_file ("A/deeper/deeper/baz", "boo");
116$svk->up;
117chdir ('A');
118TODO: {
119local $TODO = 'target_condensed and report being .';
120is_output ($svk, 'status', ['deeper/deeper'],
121	   [__('C   deeper'),
122	    __('C   deeper/deeper'),
123	    __('C   deeper/deeper/baz')
124	   ]);
125}
126chdir ('..');
127$svk->revert ('-R', 'A');
128$svk->add ('A/deeper');
129$svk->ps ('foo', 'bar', 'A/deeper');
130$svk->ps ('bar', 'ksf', 'A/deeper');
131is_output ($svk, 'st', [],
132	   [map {__($_)}
133	    ('?   A/bar',
134	     'A   A/deeper',
135	     'A   A/deeper/deeper',
136	     'A   A/deeper/deeper/baz',
137	     '~   A/deep')]);
138my $cowner = $ENV{USER};
139$svk->ps ('-r2', '--revprop', 'svn:author', 'user2');
140$svk->ps ('-r3', '--revprop', 'svn:author', 'user3');
141$svk->ps ('-r5', '--revprop', 'svn:author', 'user5');
142is_output ($svk, 'st', ['--verbose'],
143	   [map {__($_)}
144	    ('           5        2 user2        A/another',
145	     '           5        3 user3        A/foo',
146	     '?                                  A/bar',
147	     'A          0       ?   ?           A/deeper',
148	     'A          0       ?   ?           A/deeper/deeper',
149	     'A          0       ?   ?           A/deeper/deeper/baz',
150	     '~         ?        ?   ?           A/deep',
151	     '           5        5 user5        A',
152	     '           5        5 user5        .')]);
153overwrite_file ("A/bar.o", "binary stuff\n");
154is_output ($svk, 'status', ['--no-ignore'],
155	   [map {__($_)}
156	    ('?   A/bar',
157	     'I   A/bar.o',
158	     'A   A/deeper',
159	     'A   A/deeper/deeper',
160	     'A   A/deeper/deeper/baz',
161	     'I   A/foo~',
162	     '~   A/deep')]);
163$svk->ps ('svn:ignore', 'test', 'A/deeper');
164overwrite_file ("A/deeper/test", "fnord\nmore");
165is_output ($svk, 'status', ['--quiet', '--no-ignore'],
166	   [map {__($_)}
167	    ('I   A/bar.o',
168	     'A   A/deeper',
169	     'A   A/deeper/deeper',
170	     'A   A/deeper/deeper/baz',
171	     'I   A/deeper/test',
172	     'I   A/foo~',
173	     '~   A/deep')]);
174is_output ($svk, 'status', ['--non-recursive', 'A'],
175	   [map {__($_)}
176	    ('?   A/bar',
177	     'A   A/deeper',
178	     '~   A/deep')]);
179$svk->ci ('A/deeper', '-m', 'added deeper');
180$svk->ps ('-r6', '--revprop', 'svn:author', 'user6');
181$svk->cp ('A/deeper', 'A/deeper-copy');
182is_output ($svk, 'st', ['--verbose'],
183	   [map {__($_)}
184	    ('           6        2 user2        A/another',
185	     '           6        6 user6        A/deeper/deeper/baz',
186	     '           6        6 user6        A/deeper/deeper',
187	     '           6        6 user6        A/deeper',
188	     '           6        3 user3        A/foo',
189	     '?                                  A/bar',
190	     'A +        -        6 user6        A/deeper-copy',
191	     '  +        -        6 user6        A/deeper-copy/deeper/baz',
192	     '  +        -        6 user6        A/deeper-copy/deeper',
193	     '~         ?        ?   ?           A/deep',
194	     '           6        6 user6        A',
195	     '           6        6 user6        .')]);
196append_file ("A/deeper-copy/deeper/baz", "more baz");
197is_output ($svk, 'st', ['--verbose'],
198	   [map {__($_)}
199	    ('           6        2 user2        A/another',
200	     '           6        6 user6        A/deeper/deeper/baz',
201	     '           6        6 user6        A/deeper/deeper',
202	     '           6        6 user6        A/deeper',
203	     '           6        3 user3        A/foo',
204	     '?                                  A/bar',
205	     'A +        -        6 user6        A/deeper-copy',
206	     'M +        -        6 user6        A/deeper-copy/deeper/baz',
207	     '  +        -        6 user6        A/deeper-copy/deeper',
208	     '~         ?        ?   ?           A/deep',
209	     '           6        6 user6        A',
210	     '           6        6 user6        .')]);
211
212overwrite_file("A/deeper-copy/bah", "ignore me");
213is_output($svk, 'ignore', ["A/bar", "A/deeper-copy/bah"],
214          [   ' M  A',
215           __(' M  A/deeper-copy')]);
216$svk->diff('A');
217
218is_output($svk, 'status', ['--verbose'],
219          [map {__($_)}
220           ('           6        2 user2        A/another',
221            '           6        6 user6        A/deeper/deeper/baz',
222            '           6        6 user6        A/deeper/deeper',
223            '           6        6 user6        A/deeper',
224            '           6        3 user3        A/foo',
225            'A +        -        6 user6        A/deeper-copy',
226            'M +        -        6 user6        A/deeper-copy/deeper/baz',
227            '  +        -        6 user6        A/deeper-copy/deeper',
228            '~         ?        ?   ?           A/deep',
229            ' M         6        6 user6        A',
230            '           6        6 user6        .')]);
231