| 
									
										
										
										
											2009-02-09 16:51:03 +00:00
										 |  |  | # Functions for copying sources to the Nix store. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | let lib = import ./default.nix; in | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | rec { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-02 16:03:35 +01:00
										 |  |  |   # Returns the type of a path: regular (for file), symlink, or directory | 
					
						
							|  |  |  |   pathType = p: with builtins; getAttr (baseNameOf p) (readDir (dirOf p)); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   # Returns true if the path exists and is a directory, false otherwise | 
					
						
							|  |  |  |   pathIsDirectory = p: if builtins.pathExists p then (pathType p) == "directory" else false; | 
					
						
							| 
									
										
										
										
											2009-02-09 16:51:03 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |   # Bring in a path as a source, filtering out all Subversion and CVS | 
					
						
							|  |  |  |   # directories, as well as backup files (*~). | 
					
						
							| 
									
										
										
										
											2016-11-17 22:21:18 -05:00
										 |  |  |   cleanSourceFilter = name: type: let baseName = baseNameOf (toString name); in ! ( | 
					
						
							|  |  |  |     # Filter out Subversion and CVS directories. | 
					
						
							|  |  |  |     (type == "directory" && (baseName == ".git" || baseName == ".svn" || baseName == "CVS" || baseName == ".hg")) || | 
					
						
							|  |  |  |     # Filter out backup files. | 
					
						
							|  |  |  |     lib.hasSuffix "~" baseName || | 
					
						
							|  |  |  |     # Filter out generates files. | 
					
						
							|  |  |  |     lib.hasSuffix ".o" baseName || | 
					
						
							|  |  |  |     lib.hasSuffix ".so" baseName || | 
					
						
							|  |  |  |     # Filter out nix-build result symlinks | 
					
						
							|  |  |  |     (type == "symlink" && lib.hasPrefix "result" baseName) | 
					
						
							|  |  |  |   ); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   cleanSource = builtins.filterSource cleanSourceFilter; | 
					
						
							| 
									
										
										
										
											2009-02-09 16:51:03 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   # Get all files ending with the specified suffices from the given | 
					
						
							| 
									
										
										
										
											2014-08-25 14:33:17 +02:00
										 |  |  |   # directory or its descendants.  E.g. `sourceFilesBySuffices ./dir | 
					
						
							|  |  |  |   # [".xml" ".c"]'. | 
					
						
							| 
									
										
										
										
											2009-02-09 16:51:03 +00:00
										 |  |  |   sourceFilesBySuffices = path: exts: | 
					
						
							|  |  |  |     let filter = name: type: | 
					
						
							|  |  |  |       let base = baseNameOf (toString name); | 
					
						
							| 
									
										
										
										
											2014-08-25 14:33:17 +02:00
										 |  |  |       in type == "directory" || lib.any (ext: lib.hasSuffix ext base) exts; | 
					
						
							| 
									
										
										
										
											2009-02-09 16:51:03 +00:00
										 |  |  |     in builtins.filterSource filter path; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-02 16:03:35 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-24 23:34:28 +01:00
										 |  |  |   # Get the commit id of a git repo | 
					
						
							|  |  |  |   # Example: commitIdFromGitRepo <nixpkgs/.git> | 
					
						
							|  |  |  |   commitIdFromGitRepo = | 
					
						
							|  |  |  |     let readCommitFromFile = path: file: | 
					
						
							|  |  |  |       with builtins; | 
					
						
							|  |  |  |         let fileName       = toString path + "/" + file; | 
					
						
							|  |  |  |             packedRefsName = toString path + "/packed-refs"; | 
					
						
							|  |  |  |         in if lib.pathExists fileName | 
					
						
							|  |  |  |            then | 
					
						
							| 
									
										
										
										
											2016-07-31 21:58:54 +09:00
										 |  |  |              let fileContent = lib.fileContents fileName; | 
					
						
							| 
									
										
										
										
											2016-05-24 23:34:28 +01:00
										 |  |  |                  # Sometimes git stores the commitId directly in the file but | 
					
						
							|  |  |  |                  # sometimes it stores something like: «ref: refs/heads/branch-name» | 
					
						
							| 
									
										
										
										
											2016-07-31 21:58:54 +09:00
										 |  |  |                  matchRef    = match "^ref: (.*)$" fileContent; | 
					
						
							| 
									
										
										
										
											2016-05-24 23:34:28 +01:00
										 |  |  |              in if   isNull matchRef | 
					
						
							| 
									
										
										
										
											2016-07-31 21:58:54 +09:00
										 |  |  |                 then fileContent | 
					
						
							| 
									
										
										
										
											2016-05-24 23:34:28 +01:00
										 |  |  |                 else readCommitFromFile path (lib.head matchRef) | 
					
						
							|  |  |  |            # Sometimes, the file isn't there at all and has been packed away in the | 
					
						
							|  |  |  |            # packed-refs file, so we have to grep through it: | 
					
						
							|  |  |  |            else if lib.pathExists packedRefsName | 
					
						
							|  |  |  |            then | 
					
						
							| 
									
										
										
										
											2016-07-27 15:44:26 +01:00
										 |  |  |              let fileContent = readFile packedRefsName; | 
					
						
							| 
									
										
										
										
											2016-08-08 11:43:39 +01:00
										 |  |  |                  matchRef    = match (".*\n([^\n ]*) " + file + "\n.*") fileContent; | 
					
						
							| 
									
										
										
										
											2016-07-27 15:44:26 +01:00
										 |  |  |              in if   isNull matchRef | 
					
						
							|  |  |  |                 then throw ("Could not find " + file + " in " + packedRefsName) | 
					
						
							|  |  |  |                 else lib.head matchRef | 
					
						
							| 
									
										
										
										
											2016-05-24 23:34:28 +01:00
										 |  |  |            else throw ("Not a .git directory: " + path); | 
					
						
							|  |  |  |     in lib.flip readCommitFromFile "HEAD"; | 
					
						
							| 
									
										
										
										
											2009-02-09 16:51:03 +00:00
										 |  |  | } |