Mercurial > jhg
comparison src/org/tmatesoft/hg/repo/HgIgnore.java @ 408:e732521a9eb4 smartgit3
Issue 28: support hgignore entries with syntax prefix
author | Artem Tikhomirov <tikhomirov.artem@gmail.com> |
---|---|
date | Fri, 16 Mar 2012 15:06:44 +0100 |
parents | 58016b1b8554 |
children | 0f5696623512 |
comparison
equal
deleted
inserted
replaced
407:30922c728341 | 408:e732521a9eb4 |
---|---|
1 /* | 1 /* |
2 * Copyright (c) 2010-2011 TMate Software Ltd | 2 * Copyright (c) 2010-2012 TMate Software Ltd |
3 * | 3 * |
4 * This program is free software; you can redistribute it and/or modify | 4 * This program is free software; you can redistribute it and/or modify |
5 * it under the terms of the GNU General Public License as published by | 5 * it under the terms of the GNU General Public License as published by |
6 * the Free Software Foundation; version 2 of the License. | 6 * the Free Software Foundation; version 2 of the License. |
7 * | 7 * |
53 fr.close(); | 53 fr.close(); |
54 } | 54 } |
55 } | 55 } |
56 | 56 |
57 /* package-local */List<String> read(BufferedReader content) throws IOException { | 57 /* package-local */List<String> read(BufferedReader content) throws IOException { |
58 final String REGEXP = "regexp", GLOB = "glob"; | |
59 final String REGEXP_PREFIX = REGEXP + ":", GLOB_PREFIX = GLOB + ":"; | |
58 ArrayList<String> errors = new ArrayList<String>(); | 60 ArrayList<String> errors = new ArrayList<String>(); |
59 ArrayList<Pattern> result = new ArrayList<Pattern>(entries); // start with existing | 61 ArrayList<Pattern> result = new ArrayList<Pattern>(entries); // start with existing |
60 String syntax = "regexp"; // or "glob" | 62 String syntax = REGEXP; |
61 String line; | 63 String line; |
62 while ((line = content.readLine()) != null) { | 64 while ((line = content.readLine()) != null) { |
63 line = line.trim(); | 65 line = line.trim(); |
64 if (line.startsWith("syntax:")) { | 66 if (line.startsWith("syntax:")) { |
65 syntax = line.substring("syntax:".length()).trim(); | 67 syntax = line.substring("syntax:".length()).trim(); |
66 if (!"regexp".equals(syntax) && !"glob".equals(syntax)) { | 68 if (!REGEXP.equals(syntax) && !GLOB.equals(syntax)) { |
67 errors.add(line); | 69 errors.add(line); |
68 continue; | 70 continue; |
69 //throw new IllegalStateException(line); | 71 //throw new IllegalStateException(line); |
70 } | 72 } |
71 } else if (line.length() > 0) { | 73 } else if (line.length() > 0) { |
79 s = x; // with exclusion of char at [x], s now points to what used to be at [x+1] | 81 s = x; // with exclusion of char at [x], s now points to what used to be at [x+1] |
80 } else { | 82 } else { |
81 line = line.substring(0, x).trim(); | 83 line = line.substring(0, x).trim(); |
82 } | 84 } |
83 } | 85 } |
86 // due to the nature of Mercurial implementation, lines prefixed with syntax kind | |
87 // are processed correctly (despite the fact hgignore(5) suggest "syntax:<kind>" as the | |
88 // only way to specify it). lineSyntax below leaves a chance for the line to switch | |
89 // syntax in use without affecting default kind. | |
90 String lineSyntax; | |
91 if (line.startsWith(GLOB_PREFIX)) { | |
92 line = line.substring(GLOB_PREFIX.length()).trim(); | |
93 lineSyntax = GLOB; | |
94 } else if (line.startsWith(REGEXP_PREFIX)) { | |
95 line = line.substring(REGEXP_PREFIX.length()).trim(); | |
96 lineSyntax = REGEXP; | |
97 } else { | |
98 lineSyntax = syntax; | |
99 } | |
84 if (line.length() == 0) { | 100 if (line.length() == 0) { |
85 continue; | 101 continue; |
86 } | 102 } |
87 if ("glob".equals(syntax)) { | 103 if (GLOB.equals(lineSyntax)) { |
88 // hgignore(5) | 104 // hgignore(5) |
89 // (http://www.selenic.com/mercurial/hgignore.5.html) says slashes '\' are escape characters, | 105 // (http://www.selenic.com/mercurial/hgignore.5.html) says slashes '\' are escape characters, |
90 // hence no special treatment of Windows path | 106 // hence no special treatment of Windows path |
91 // however, own attempts make me think '\' on Windows are not treated as escapes | 107 // however, own attempts make me think '\' on Windows are not treated as escapes |
92 line = glob2regex(line); | 108 line = glob2regex(line); |
93 } else { | 109 } else { |
94 assert "regexp".equals(syntax); | 110 assert REGEXP.equals(lineSyntax); |
95 // regular expression patterns need not match start of the line unless demanded explicitly | 111 // regular expression patterns need not match start of the line unless demanded explicitly |
96 line = line.charAt(0) == '^' ? line : ".*" + line; | 112 line = line.charAt(0) == '^' ? line : ".*" + line; |
97 } | 113 } |
98 try { | 114 try { |
99 result.add(Pattern.compile(line)); // case-sensitive | 115 result.add(Pattern.compile(line)); // case-sensitive |