|  | @@ -57,7 +57,7 @@ func HandlePush(payload interface{}, header webhooks.Header) {
 | 
	
		
			
			| 57 | 57 |  	// case a file is successively updated by two commits pushed at the same
 | 
	
		
			
			| 58 | 58 |  	// time, it would push the same file several time, which isn't an optimised
 | 
	
		
			
			| 59 | 59 |  	// behaviour.
 | 
	
		
			
			| 60 |  | -	filesToPush := make(map[string]bool)
 | 
	
		
			
			|  | 60 | +	filesToPush := make(map[string][]byte)
 | 
	
		
			
			| 61 | 61 |  
 | 
	
		
			
			| 62 | 62 |  	// Iterate over the commits descriptions from the payload
 | 
	
		
			
			| 63 | 63 |  	for _, commit := range pl.Commits {
 | 
	
	
		
			
			|  | @@ -72,56 +72,40 @@ func HandlePush(payload interface{}, header webhooks.Header) {
 | 
	
		
			
			| 72 | 72 |  			continue
 | 
	
		
			
			| 73 | 73 |  		}
 | 
	
		
			
			| 74 | 74 |  
 | 
	
		
			
			| 75 |  | -		// Push all added files, except the ones describing a dashboard which
 | 
	
		
			
			| 76 |  | -		// name starts with a the prefix specified in the configuration file.
 | 
	
		
			
			|  | 75 | +		// Set all added files to be pushed, except the ones describing a
 | 
	
		
			
			|  | 76 | +		// dashboard which name starts with a the prefix specified in the
 | 
	
		
			
			|  | 77 | +		// configuration file.
 | 
	
		
			
			| 77 | 78 |  		for _, addedFile := range commit.Added {
 | 
	
		
			
			| 78 |  | -			ignored, err := isIgnored(addedFile)
 | 
	
		
			
			| 79 |  | -			if err != nil {
 | 
	
		
			
			|  | 79 | +			if err = prepareForPush(addedFile, &filesToPush); err != nil {
 | 
	
		
			
			| 80 | 80 |  				logrus.WithFields(logrus.Fields{
 | 
	
		
			
			| 81 | 81 |  					"error":    err,
 | 
	
		
			
			| 82 | 82 |  					"filename": addedFile,
 | 
	
		
			
			| 83 |  | -				}).Error("Failed to check if file is to be ignored")
 | 
	
		
			
			|  | 83 | +				}).Error("Failed to prepare file for push")
 | 
	
		
			
			| 84 | 84 |  
 | 
	
		
			
			| 85 | 85 |  				continue
 | 
	
		
			
			| 86 | 86 |  			}
 | 
	
		
			
			| 87 |  | -
 | 
	
		
			
			| 88 |  | -			if !ignored {
 | 
	
		
			
			| 89 |  | -				logrus.WithFields(logrus.Fields{
 | 
	
		
			
			| 90 |  | -					"filename": addedFile,
 | 
	
		
			
			| 91 |  | -				}).Info("Setting file as file to push to Grafana")
 | 
	
		
			
			| 92 |  | -
 | 
	
		
			
			| 93 |  | -				filesToPush[addedFile] = true
 | 
	
		
			
			| 94 |  | -			}
 | 
	
		
			
			| 95 | 87 |  		}
 | 
	
		
			
			| 96 | 88 |  
 | 
	
		
			
			| 97 |  | -		// Push all modified files, except the ones describing a dashboard which
 | 
	
		
			
			| 98 |  | -		// name starts with a the prefix specified in the configuration file.
 | 
	
		
			
			|  | 89 | +		// Set all modified files to be pushed, except the ones describing a
 | 
	
		
			
			|  | 90 | +		// dashboard which name starts with a the prefix specified in the
 | 
	
		
			
			|  | 91 | +		// configuration file.
 | 
	
		
			
			| 99 | 92 |  		for _, modifiedFile := range commit.Modified {
 | 
	
		
			
			| 100 |  | -			ignored, err := isIgnored(modifiedFile)
 | 
	
		
			
			| 101 |  | -			if err != nil {
 | 
	
		
			
			|  | 93 | +			if err = prepareForPush(modifiedFile, &filesToPush); err != nil {
 | 
	
		
			
			| 102 | 94 |  				logrus.WithFields(logrus.Fields{
 | 
	
		
			
			| 103 | 95 |  					"error":    err,
 | 
	
		
			
			| 104 | 96 |  					"filename": modifiedFile,
 | 
	
		
			
			| 105 |  | -				}).Error("Failed to check if file is to be ignored")
 | 
	
		
			
			|  | 97 | +				}).Error("Failed to prepare file for push")
 | 
	
		
			
			| 106 | 98 |  
 | 
	
		
			
			| 107 | 99 |  				continue
 | 
	
		
			
			| 108 | 100 |  			}
 | 
	
		
			
			| 109 |  | -
 | 
	
		
			
			| 110 |  | -			if !ignored {
 | 
	
		
			
			| 111 |  | -				logrus.WithFields(logrus.Fields{
 | 
	
		
			
			| 112 |  | -					"filename": modifiedFile,
 | 
	
		
			
			| 113 |  | -				}).Info("Setting file as file to push to Grafana")
 | 
	
		
			
			| 114 |  | -
 | 
	
		
			
			| 115 |  | -				filesToPush[modifiedFile] = true
 | 
	
		
			
			| 116 |  | -			}
 | 
	
		
			
			| 117 | 101 |  		}
 | 
	
		
			
			| 118 | 102 |  
 | 
	
		
			
			| 119 | 103 |  		// TODO: Remove a dashboard when its file gets deleted?
 | 
	
		
			
			| 120 | 104 |  	}
 | 
	
		
			
			| 121 | 105 |  
 | 
	
		
			
			| 122 | 106 |  	// Push all files to the Grafana API
 | 
	
		
			
			| 123 |  | -	for fileToPush := range filesToPush {
 | 
	
		
			
			| 124 |  | -		if err = pushFile(fileToPush); err != nil {
 | 
	
		
			
			|  | 107 | +	for fileToPush, fileContent := range filesToPush {
 | 
	
		
			
			|  | 108 | +		if err = grafanaClient.CreateOrUpdateDashboard(fileContent); err != nil {
 | 
	
		
			
			| 125 | 109 |  			logrus.WithFields(logrus.Fields{
 | 
	
		
			
			| 126 | 110 |  				"error":    err,
 | 
	
		
			
			| 127 | 111 |  				"filename": fileToPush,
 | 
	
	
		
			
			|  | @@ -143,45 +127,56 @@ func HandlePush(payload interface{}, header webhooks.Header) {
 | 
	
		
			
			| 143 | 127 |  	}
 | 
	
		
			
			| 144 | 128 |  }
 | 
	
		
			
			| 145 | 129 |  
 | 
	
		
			
			| 146 |  | -// pushFile pushes the content of a given file to the Grafana API in order to
 | 
	
		
			
			| 147 |  | -// create or update a dashboard.
 | 
	
		
			
			| 148 |  | -// Returns an error if there was an issue reading the file or sending its content
 | 
	
		
			
			| 149 |  | -// to the Grafana instance.
 | 
	
		
			
			| 150 |  | -func pushFile(filename string) error {
 | 
	
		
			
			| 151 |  | -	filePath := cfg.Git.ClonePath + "/" + filename
 | 
	
		
			
			| 152 |  | -	fileContent, err := ioutil.ReadFile(filePath)
 | 
	
		
			
			|  | 130 | +// prepareForPush reads the file containing the JSON representation of a
 | 
	
		
			
			|  | 131 | +// dashboard, checks if the dashboard is set to be ignored, and if not appends
 | 
	
		
			
			|  | 132 | +// its content to a map, which will be later iterated over to push the contents
 | 
	
		
			
			|  | 133 | +// it contains to the Grafana API.
 | 
	
		
			
			|  | 134 | +// Returns an error if there was an issue reading the file or checking if the
 | 
	
		
			
			|  | 135 | +// dashboard it represents is to be ignored.
 | 
	
		
			
			|  | 136 | +func prepareForPush(
 | 
	
		
			
			|  | 137 | +	filename string, filesToPush *map[string][]byte,
 | 
	
		
			
			|  | 138 | +) (err error) {
 | 
	
		
			
			|  | 139 | +	// Don't set versions.json to be pushed
 | 
	
		
			
			|  | 140 | +	if strings.HasSuffix(filename, "versions.json") {
 | 
	
		
			
			|  | 141 | +		return
 | 
	
		
			
			|  | 142 | +	}
 | 
	
		
			
			|  | 143 | +
 | 
	
		
			
			|  | 144 | +	// Read the file's content
 | 
	
		
			
			|  | 145 | +	fileContent, err := ioutil.ReadFile(filename)
 | 
	
		
			
			| 153 | 146 |  	if err != nil {
 | 
	
		
			
			| 154 |  | -		return err
 | 
	
		
			
			|  | 147 | +		return
 | 
	
		
			
			| 155 | 148 |  	}
 | 
	
		
			
			| 156 | 149 |  
 | 
	
		
			
			| 157 |  | -	return grafanaClient.CreateOrUpdateDashboard(fileContent)
 | 
	
		
			
			|  | 150 | +	// Check if dashboard is ignored
 | 
	
		
			
			|  | 151 | +	ignored, err := isIgnored(fileContent)
 | 
	
		
			
			|  | 152 | +	if err != nil {
 | 
	
		
			
			|  | 153 | +		return
 | 
	
		
			
			|  | 154 | +	}
 | 
	
		
			
			|  | 155 | +
 | 
	
		
			
			|  | 156 | +	// Append to the list of contents to push to Grafana
 | 
	
		
			
			|  | 157 | +	if !ignored {
 | 
	
		
			
			|  | 158 | +		logrus.WithFields(logrus.Fields{
 | 
	
		
			
			|  | 159 | +			"filename": filename,
 | 
	
		
			
			|  | 160 | +		}).Info("Preparing file to be pushed to Grafana")
 | 
	
		
			
			|  | 161 | +
 | 
	
		
			
			|  | 162 | +		(*filesToPush)[filename] = fileContent
 | 
	
		
			
			|  | 163 | +	}
 | 
	
		
			
			|  | 164 | +
 | 
	
		
			
			|  | 165 | +	return
 | 
	
		
			
			| 158 | 166 |  }
 | 
	
		
			
			| 159 | 167 |  
 | 
	
		
			
			| 160 | 168 |  // isIgnored checks whether the file must be ignored, by checking if there's an
 | 
	
		
			
			| 161 | 169 |  // prefix for ignored files set in the configuration file, and if the dashboard
 | 
	
		
			
			| 162 | 170 |  // described in the file has a name that starts with this prefix. Returns an
 | 
	
		
			
			| 163 | 171 |  // error if there was an issue reading or decoding the file.
 | 
	
		
			
			| 164 |  | -// TODO: Optimise this part of the workflow, as all files get open twice (here
 | 
	
		
			
			| 165 |  | -// and in pushFile)
 | 
	
		
			
			| 166 |  | -func isIgnored(filename string) (bool, error) {
 | 
	
		
			
			| 167 |  | -	// Always ignore versions.json
 | 
	
		
			
			| 168 |  | -	if strings.HasSuffix(filename, "versions.json") {
 | 
	
		
			
			| 169 |  | -		return true, nil
 | 
	
		
			
			| 170 |  | -	}
 | 
	
		
			
			| 171 |  | -
 | 
	
		
			
			|  | 172 | +func isIgnored(dashboardJSON []byte) (bool, error) {
 | 
	
		
			
			| 172 | 173 |  	// If there's no prefix set, no file is ignored
 | 
	
		
			
			| 173 | 174 |  	if len(cfg.Grafana.IgnorePrefix) == 0 {
 | 
	
		
			
			| 174 | 175 |  		return false, nil
 | 
	
		
			
			| 175 | 176 |  	}
 | 
	
		
			
			| 176 | 177 |  
 | 
	
		
			
			| 177 |  | -	// Read the file's content
 | 
	
		
			
			| 178 |  | -	fileContent, err := ioutil.ReadFile(filename)
 | 
	
		
			
			| 179 |  | -	if err != nil {
 | 
	
		
			
			| 180 |  | -		return false, err
 | 
	
		
			
			| 181 |  | -	}
 | 
	
		
			
			| 182 |  | -
 | 
	
		
			
			| 183 | 178 |  	// Parse the file's content to extract its slug
 | 
	
		
			
			| 184 |  | -	slug, err := helpers.GetDashboardSlug(fileContent)
 | 
	
		
			
			|  | 179 | +	slug, err := helpers.GetDashboardSlug(dashboardJSON)
 | 
	
		
			
			| 185 | 180 |  	if err != nil {
 | 
	
		
			
			| 186 | 181 |  		return false, err
 | 
	
		
			
			| 187 | 182 |  	}
 |